我正在嘗試學習一些關于python中的執行緒。我知道有很多其他的池子和行程或管道可以使用,可能會更簡單,但我對使用執行緒模塊感興趣。
from threading import Thread
from queue import Queue
class SimulationThread(Thread)。
def __init__(self, input_queue: Queue, results_queue: Queue):
Thread.__init__(self)
self.input_queue = input_queue
self.results_queue = results_queue
def run(self) -> None:
try:
data = self.input_queue.get() # will be replaced with simulation data.
self.results_queue.put(data)
finally:
return self.input_queue.task_done()
N = 10 # 運行的模擬數量。
NP = 8 # 使用的執行緒數。
input_queue = Queue()
results_queue = Queue()
for x in range(NP)。
worker = SimulationThread(input_queue, results_queue)
worker.daemon = True: worker.start()
Worker.start()
for i in range(N)。
input_queue.put(i)
現在我嘗試了一些不同的方法來收集結果:
# always returns 0。
print(results_queue.get())
#hangs
results_queue.join()
# does nothing, I'm quessing queue is not yet populated。
while not results_queue.empty()。
print(results_queue.get())
# prints nothing。
ret = results_queue.get()
while ret is None:
ret = results_queue.get()
print(ret)
# 最后列印出了結果,但順序是1-7。沒有8或9。
ret = results_queue.get()
while ret is not None:
ret = results_queue.get()
print(ret)
if results_queue. empty():
ret = None
這時我停下來,請求一些幫助。我怎樣才能讓所有NP執行緒同時處理所有N個數字呢?
uj5u.com熱心網友回復:
默認情況下,Queue.get將在必要時阻塞,直到有專案可用。你在input_queue佇列中添加了10個專案,但是你只創建了8個執行緒。
你的執行緒應該不斷地從佇列中收集和處理專案,直到它們被停止。
test.py:
from queue import Queue
from threading import Thread
N = 10 #運行的模擬數量 #運行的模擬數量
NP = 8 # 要使用的執行緒數。
class SimulationThread(Thread)。
def __init__(self, input_queue, results_queue) 。
super().__init__()
self.input_queue = input_queue
self.results_queue = results_queue
def run(self)。
for data in iter(self.input_queue.get, "STOP") 。
self.results_queue.put(data * 2)
def main()。
input_queue = Queue()
results_queue = Queue()
for i in range(N)。
input_queue.put(i)
for _ in range(NP):
SimulationThread(input_queue, results_queue).start()
for i in range(N)。
print(i, results_queue.get() )
for _ in range(NP)。
input_queue.put("STOP")
if __name__ == "__main__"/span>:
main()
測驗:
$ python test.py
0 0
1 2
2 4
3 6
4 8
5 10
6 12
7 14
8 16
9 18
uj5u.com熱心網友回復:
你可能想使用一個JoinableQueue。 每個任務,當它完成它的作業時,在佇列中呼叫.task_done()來獲取輸入。
你的主執行緒然后在同一佇列上呼叫queue.join()。 直到對task_done()的呼叫次數與添加到佇列中的專案的數量相同時,才會回傳。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325303.html
標籤:
上一篇:同時運行兩個任務
下一篇:為Asyncio添加多執行緒層
