zoukankan      html  css  js  c++  java
  • python多进程中的队列数据共享问题

    0x00 起

    今天在写一个小东西的时候,需要控制并发量,但又不能直接调用python multiprocessing(问题会在文后提到)。于是尝试用Queue来实现。

    最一开始的思路是这样的:

    from multiprocessing import Process
    from Queue import Queue
    
    
    q = Queue(maxsize = 10)
    
    # 通过web应用往队列中添加数据
    def put(num):
        q.put(num)
    
    def read():
        while True:
            print q.get()
    
    
    if __name__ == '__main__':
        Process(target=read, args=())

    队列的数据,是从web应用中添加过来的(上面省略了bottle的代码),开了一个进程,不断从queue中读取数据,并进行处理(省略了处理过程)。

    逻辑是没错的,但是在实际测试的时候,发现一个问题。

    Queue.get()函数是个默认阻塞的函数,如果队列为空,会一直等待,类似于socket.recv。在测试的时候,程序一直卡在这里,也就是说read()函数并没有读到队列中的数据。

    0x10 承

    为了解决验证这个问题,我修改了一下代码,打印相关的信息:

    # encoding: utf-8
    from multiprocessing import Process
    from Queue import Queue
    
    
    q = Queue(maxsize = 10)
    
    # 通过web应用往队列中添加数据
    def put(num):
        q.put(num)
    
    def read():
        print q.qsize()
        # while True:
        #     print q.get()
    
    
    if __name__ == '__main__':
        put(2333)
        print q.qsize()
        Process(target=read, args=()).start()

    打印出来的结果是1 0。在新开的进程中的队列,果然是空的。

    去查了一下资料(http://my.oschina.net/yangyanxing/blog/296052),给出的解释是:队列对象不能在父进程与子进程间通信

    0x20 转

    最后得知multiprocessing提供了Queue供调用,可完美解决这个问题。

    # encoding: utf-8
    from multiprocessing import Process, Queue
    
    
    q = Queue(10)
    
    # 通过web应用往队列中添加数据
    def put(num):
        q.put(num)
    
    def read():
        while True:
            print q.get()
    
    if __name__ == '__main__':
        put(2333)
        print q.qsize()
        Process(target=read, args=()).start()

    0x30 合

    上面提到,在bottle中无法使用multiprocessing,稍微查了一下,给出的原因是线程中无法开进程。还没太理解。

  • 相关阅读:
    关于如何使用Microsoft Word发博客
    TEST
    信息安全系统设计基础第三周学习总结
    信息安全系统设计基础第一周学习总结
    Java程序设计实验 实验五
    实验三 敏捷开发与XP实践 实验报告
    git 连接github的配置
    nginx是什么,如何使用
    spring-boot 全面认知
    删除指定目录文件夹下的文件
  • 原文地址:https://www.cnblogs.com/kuoaidebb/p/4786879.html
Copyright © 2011-2022 走看看