田小花語音機器人(四)使用網絡通訊解決多線程間的數據共享問題——使用python threading類

本篇分成兩部分,證明線程間通信很難實現、使用網絡解決線程間數據通信的問題。

——————————————————————————————————————————

解釋一下哦 參考:線程間通信——數據傳遞和同步

線程間數據傳遞會產生兩個問題:
1)競爭
兩個線程同時修改一個變量,後一個人的修改會覆蓋前一個人的修改,這種情況叫做競爭。
2)死鎖
當一個線程佔用資源A而請求資源B,另一個線程佔用資源B而請求資源A,兩個線程都無法繼續運行,這種情況叫做死鎖。

所以使用普通方法是不能兩個線程使用同一個變量的!!! 卒 T_T

參考這篇文章:Python3-threading.local()代替普通全局變量 找到半個解決辦法,使用thread線程的threading.local()方法可以建立一個所有線程都可以使用的變量。
比如value = threading.local() 則建立了一個全局字典,這個全局字典可以直接在某一個線程裏調用,比如在子線程1裏面可以直接使用value.value_1 = 0這樣的操作。

但是並不能達到數據共享的目的,只是把變量的名字共享了!!!!

實現代碼如下:

#!/usr/bin/python
#encoding:utf-8

import threading
import time
#創建全局ThreadLocal對象
local_value=threading.local()
local_value.i = 2
#
def function():
    #for local_value.i in range(5):
    local_value.i = 0
    print(threading.current_thread().name, local_value.i)  # 通過 thread.current_thread() 方法可以返回線程本身,然後就可以訪問它的 name 屬性。
    time.sleep(0.5)
#
def function_2():
    #for local_value.i in range(5):
    time.sleep(0.5)
    local_value.i = 1
    print(threading.current_thread().name, local_value.i)  # 通過 thread.current_thread() 方法可以返回線程本身,然後就可以訪問它的 name 屬性。
#
thread_1 = threading.Thread(target=function,name='子線程(1):') #建立子線
thread_1.start()#線程開始執行
thread_2 = threading.Thread(target=function_2,name='子線程(2):') #建立子線
thread_2.start()#線程開始執行
#
"""主線程"""
print('主線程的值: ', local_value.i)

結果如下:

子線程(1): 0
主線程的值:  2
子線程(2): 1

當我在建立子線程1後,在裏面對local_value.i = 1進行賦值,然後延時0.5秒。在這期間在主線程調用local_value.i ,直接打印就會報錯,報錯告訴我local_value.i 還沒有定義!!!

果斷改變思路。使用網絡socket通信進行數據傳遞
————————————————————————————————————————
見下一篇博客
、_、
2333333333

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章