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,稍微查了一下,给出的原因是线程中无法开进程。还没太理解。

转载于:https://www.cnblogs.com/kuoaidebb/p/4786879.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值