[英]Implementing threads in python with threading module
在python程序中,我需要2個基於Threading模塊的線程。 線程#1生成一些數據並將其放入緩沖區,線程#2應該處理緩沖區中的數據。
所以我的偽代碼是這樣的:線程1:
Thread#1
while True:
Generate_Some_Data()
while flag==1:
pass()
Buffer_Address=Write_It_To_Buffer()
flag=1
Thread#2
while True:
while flag==0:
pass()
Process_Data(Buffer_Address)
flag=0
(讓我們假設使用合適的鎖來訪問變量“flag”。)
我知道Threading模塊不是並發的。 實質上,這意味着除非其中一個線程在某些外部條件(例如file-io或time.sleep)上沒有阻塞,否則無論任何任務如何,兩個線程都將共享總進程時間。 因此,根據我的理解,在上述配置中,大約一半的總處理時間將浪費在“while flag”循環上。
所以,這是我的問題:
我對上述線程模塊的預期/理解是對的嗎? 在“while flag”循環中浪費了總進程時間的一半嗎?
(如果我是對的)無論如何都要完全擺脫“while flag”循環? 我試圖找出另一種結構,我可以在lock.acquire()方法中讓線程睡眠,但是,我無法弄清楚%100安全的方法。 (當一個線程重新鎖定時,沒有保證另一個線程將在同一線程再次獲取之前獲取它)
聽起來像Queue
模塊就是您所需要的。
這將為您提供阻塞FIFO隊列。 每當消費者線程從隊列中獲取某些內容時,如果其中沒有任何內容,它將阻塞直到某些內容可用,從而為生產者線程提供生成內容的時間。
如果您擔心生產者線程占用所有計算周期,則可以限制隊列的大小。 如果隊列已滿,並且生產者線程有要添加的內容,它將阻塞,直到使用者線程取出某些內容。
這是一些偽代碼:
import Queue
q = Queue.Queue()
# Producer thread
while True:
data = generate_some_data()
q.put(data)
# Consumer thread
while True:
data = q.get()
process_data(data)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.