多进程与多线程使用注意事项

  当用Queue进行通信的时候,如果put进queue的时候有延迟,而get方法一直在运行的时候,如果用了while queue.qsize()!=0:来运行get则可能会出现put还没来得及进入,get就已经去Queue中取数据,所以queue.qsize()==0,导致退出循环了,这样后面再put进入的数据也取不到的。于是需要注意解析网页的时候,可以用解析列表页的url放入队列,由于列表页url一次性可以解析多个,肯定比解析详情页的方法要快。

import time
from multiprocessing import Process, Queue, Manager
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import os
# from queue import Queue
def put(queue):
    for i in range(50): queue.put(i) time.sleep(1) # 此处当put方法等待之后,还没来得及put进入队列,队列就空了(数据已经被其他进程取完了)所以进程就退出了,在put进入的数据都取不到的。 print(queue.qsize()) def get(queue): while queue.qsize()!=0: s = queue.get() print('get %s :%s' % (s, os.getpid())) print('i finished') # if __name__ == '__main__': queue = Manager().Queue(maxsize=20) executor = ProcessPoolExecutor(max_workers=5) task1 = executor.submit(put, queue) task2 = executor.submit(get, queue) task3 = executor.submit(get, queue) task4 = executor.submit(get, queue) task5 = executor.submit(get, queue) 结果: get 0 :5392 i finished i finished i finished i finished

猜你喜欢

转载自www.cnblogs.com/yc3110/p/10809567.html