執行緒間通訊

2022-03-13 22:23:27 字數 2465 閱讀 3787

比如你爬取乙個頁面,爬取主頁面是乙個執行緒,爬取詳情頁又是乙個執行緒,

當你把主頁面的內容拿到之後,你是否就需要將其傳送給處理詳情頁的那個執行緒了。

這就涉及到程序通訊問題了。

執行緒間通訊一般有兩種方式,共享變數和queue

共享變數利用的是執行緒之間共享執行環境這一機制。

但是使用共享變數,可能不能得到預期結果,因為gil鎖的緣故,

如果你一定要這樣做,可以使用執行緒互斥鎖來解決。

from threading import

thread

import

random

import

time

defgen_code():

"""隨機生成6威驗證碼

"""new_list =

for i in range(6):

num = random.randint(48,57)

new_str = ""

.join(new_list)

new_code =int(new_str)

return

new_code

data_list =

defget_data():

global

data_list

for i in range(5):

new_code =gen_code()

print("

生成驗證碼%d

"%new_code)

defhandle_data():

global

data_list

new_code =data_list.pop()

#將驗證碼傳送給使用者

time.sleep(3)

print("

已經傳送了%s

"%new_code)

if__name__ == "

__main__":

t1 = thread(target=get_data)

t1.start()

for i in range(5):

t2 = thread(target=handle_data)

t2.start()

print("

執行結束

")

執行結果:

生成驗證碼63564

生成驗證碼52472

生成驗證碼144956

生成驗證碼748569

生成驗證碼312201

執行結束

已經傳送了144956

已經傳送了748569

已經傳送了63564

已經傳送了52472

已經傳送了312201

queue內部使用deque雙端佇列

from threading import

thread

import

random

import

time

from queue import

queue

defgen_code():

"""隨機生成6威驗證碼

"""new_list =

for i in range(6):

num = random.randint(48,57)

new_str = ""

.join(new_list)

new_code =int(new_str)

return

new_code

defget_data(data_queue):

for i in range(5):

new_code =gen_code()

data_queue.put(new_code)

print("

生成驗證碼%d

"%new_code)

defhandle_data(data_queue):

global

data_list

new_code =data_queue.get()

#將驗證碼傳送給使用者

time.sleep(3)

print("

已經傳送了%s

"%new_code)

if__name__ == "

__main__":

data_queue = queue(maxsize=100)

t1 = thread(target=get_data,args=(data_queue,))

t1.start()

for i in range(5):

t2 = thread(target=handle_data,args=(data_queue,))

t2.start()

print("

執行結束

")

使用queue這種佇列的時候,執行緒之間就是安全的。

這種方式在程序中無法適用,同時可以執行插入方向和優先順序。

執行緒間通訊

執行緒間通訊 多個執行緒在操作統一資源,但各個執行緒操作的動作不同。資源 class res class input implements runnable public void run else x x 1 2 class output implements runnable public vo...

執行緒間通訊

執行緒間的通訊 在乙個多執行緒的應用程式中,所有執行緒共享程序資源,協同工作。所以,執行緒之間的通訊是編寫多執行緒 應用的必不可少的環節。執行緒之間的通訊包括互斥 同步等,它是多 執行緒設計中最難控制的部分,也是關鍵部分。執行緒間的互斥 1 臨界區 在乙個多執行緒 的應用程式中,可能存在這樣的危險 ...

執行緒間通訊

執行緒間通訊 其實就是多個執行緒在操作同乙個資源 但是操作的動作不同。等待喚醒機制 wait notify 0 notifyall 都使用在同步中,因為要對持有監視器 鎖 的執行緒操作。所以要使用在同步中,因為只有同步才具有鎖 為什麼這些操作執行緒的方法要定義object類中呢?因為這些方法在操作同...