from multiprocessing import Pool
import multiprocessing
from queue import Queue
import time
def test(p):
time.sleep(0.002)
return p
if __name__=="__main__":
pool = Pool(processes=10)
q=Queue()
for i in range(3000):
q.put(pool.apply_async(test, args=(i,)))#维持执行的进程总数为10,当一个进
while 1:#第一个while
if q.get().get()==1000:#因为用的pool的异步,所以返回的并不是怕p,而是pool文件中ApplyResult的一个实例.此时q中还有1999个元素
pool.terminate() #结束进程池中的所有子进程。
break
# pool.close()
pool.join()
while not q.empty():#第二个while
print('the second while',q.get().get())#q里还有元素怎么就停了呢????
我高度怀疑:for循环只是往q队列里放了3000个对象,和给予了子进程工作材料。在这个循环结束后,子进程仍在工作。
在第一个while中,队列中得到1000到进程池停止,实际上子进程还是完成了几个任务。所以在第二个while中,虽然打印了几个1000以后的数字,但之后就停了,因为‘加工’已经停了,没货了(没return值了),所以有如此的输出。