zoukankan      html  css  js  c++  java
  • 多进程与多线程使用注意事项

      当用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
  • 相关阅读:
    frida
    ES中filter 和map的使用
    阿里巴巴15 款开发者工具
    小程序的开发记录
    微信3.1小程序商城源码C# ASP.NET 多用户微商城 saas模式
    js中for,for in,forEach,for of的使用
    Vuejs学习笔记
    vue.js/element-ui/webpack 开发记录
    ESXi开启虚拟化
    shell把字符串中的字母去掉,只保留数字
  • 原文地址:https://www.cnblogs.com/yc3110/p/10809567.html
Copyright © 2011-2022 走看看