在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ 線程池+隊(duì)列(ThreadPoolExecutor+queue)的這段程序怎樣終

線程池+隊(duì)列(ThreadPoolExecutor+queue)的這段程序怎樣終止?

在學(xué)習(xí)并發(fā)時(shí)寫了如下測(cè)試程序,功能是向隊(duì)列1中裝入數(shù)據(jù),處理后裝入隊(duì)列2中。

import time
from queue import Queue
from concurrent.futures import ThreadPoolExecutor

#兩個(gè)隊(duì)列
q1 = Queue()
q2 = Queue()

# 函數(shù)1:取出隊(duì)列1中的值,處理后裝入隊(duì)列2中
def worker1():
    while True:
        item = q1.get()
        print('get item from q1...', 'item = %s' % item)
        time.sleep(0.1)
        q2.put(item ** 2)
        q1.task_done()

# 函數(shù)2:取出隊(duì)列2中的值
def worker2():
    while True:
        item = q2.get()
        print('get item from q2...', 'item = %s' % item)
        time.sleep(0.1)
        q2.task_done()

# 創(chuàng)建線程池
pool = ThreadPoolExecutor(10)
p1 = pool.submit(worker1)
p2 = pool.submit(worker2)

# 隊(duì)列1中裝入值
for item in range(6):
    q1.put(item)

q1.join()
q2.join()
p1.result()
p2.result()

clipboard.png
計(jì)算程序能輸出預(yù)期結(jié)果,但程序沒有終止運(yùn)行。請(qǐng)問是什么原因,以及怎樣解決?

回答
編輯回答
玩控

因?yàn)閮蓚€(gè)線程里一直在while True,可以增加一個(gè)結(jié)束信號(hào),例如給隊(duì)列里發(fā)送一個(gè)-1,線程接受到的話退出while循環(huán),要注意兩個(gè)隊(duì)列都要發(fā)送結(jié)束信號(hào)。

2017年8月30日 08:01