比如你爬取乙個頁面,爬取主頁面是乙個執行緒,爬取詳情頁又是乙個執行緒,
當你把主頁面的內容拿到之後,你是否就需要將其傳送給處理詳情頁的那個執行緒了。
這就涉及到程序通訊問題了。
執行緒間通訊一般有兩種方式,共享變數和queue
共享變數利用的是執行緒之間共享執行環境這一機制。
但是使用共享變數,可能不能得到預期結果,因為gil鎖的緣故,
如果你一定要這樣做,可以使用執行緒互斥鎖來解決。
from threading importthread
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 importthread
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類中呢?因為這些方法在操作同...