Python多处理队列不共享队列项
我正在创建两个过程。一个将向Mutliprocessing.Queue添加int值的函数,从1到5。另一个也将添加到队列中一次,然后它将循环10秒,并尝试从队列中读取值 为什么第二个进程不能在第一个线程中将项目添加到队列中?我的假设是,当创建一个Multiprocessing.Queue时,我可以从一个进程添加到它,并且它可以被另一个进程读取。看起来似乎它只是添加到被传递的QUEU,而不是父队列。我不能从父进程创建的2个不同进程向某些类型的队列添加项目吗Python多处理队列不共享队列项,python,queue,Python,Queue,我正在创建两个过程。一个将向Mutliprocessing.Queue添加int值的函数,从1到5。另一个也将添加到队列中一次,然后它将循环10秒,并尝试从队列中读取值 为什么第二个进程不能在第一个线程中将项目添加到队列中?我的假设是,当创建一个Multiprocessing.Queue时,我可以从一个进程添加到它,并且它可以被另一个进程读取。看起来似乎它只是添加到被传递的QUEU,而不是父队列。我不能从父进程创建的2个不同进程向某些类型的队列添加项目吗 from multiprocessing
from multiprocessing import Process, Queue
import time
def f(q):
for a in range(5):
print "Adding to Q!"
time.sleep(1)
q.put(a)
def g(q):
i = 0
v = True
q.put("Adding to this q")
while v == True:
time.sleep(1)
i = i + 1
print "Get slept time " , i
try:
print "From the q " + str(q.get(True,1))
except:
print "Empty"
if i == 10:
v = False
if __name__ == '__main__':
q = Queue(10)
print "First process"
p = Process(target=f, args=(q,))
p.start()
print "Second Process"
p1 = Process(target=g, args=(q,))
p1.start()
p.join()
p1.join()
添加或删除join()似乎对所需的输出没有影响
我现在的输出。**这不是期望的输出**
First process
Second Process
Adding to Q!
Get slept time 1
From the q Adding to this q
Adding to Q!
Get slept time 2
Adding to Q!
Empty
Get slept time 3
Adding to Q!
Empty
Get slept time 4
Adding to Q!
Empty
Get slept time 5
Empty
Get slept time 6
Empty
Get slept time 7
Empty
Get slept time 8
Empty
Get slept time 9
Empty
Get slept time 10
Empty
嗯,问题不在于队列,
它在您的
print“From q”+q.get(True,1)
例外情况是TypeError:无法连接'str'和'int'对象
您最好使用print“From q{}”。格式(q.get(True,1))
@跳跳
在您输入后编辑:从队列中读/写没有问题
以下是一些代码示例:
from multiprocessing import Process, Queue
import time
def f(q):
for a in range(5):
time.sleep(1)
q.put(a)
def g(q):
i = 0
v = True
q.put("Adding to this q")
while v == True:
time.sleep(1)
i = i + 1
print "Get slept time " , i
try:
print "From the q {}".format(q.get(True,1))
except Exception as e:
print 'exception raised {} {}'.format(e, type(e))
print "Empty"
if i == 10:
v = False
if __name__ == '__main__':
q = Queue(10)
p = Process(target=f, args=(q,))
p.start()
p1 = Process(target=g, args=(q,))
p1.start()
p.join()
p1.join()
print q.qsize(), q.empty()
结果是:
Get slept time 1
From the q Adding to this q
Get slept time 2
From the q 0
Get slept time 3
From the q 1
Get slept time 4
From the q 2
Get slept time 5
From the q 3
Get slept time 6
From the q 4
Get slept time 7
exception raised <class 'Queue.Empty'>
Empty
Get slept time 8
exception raised <class 'Queue.Empty'>
Empty
Get slept time 9
exception raised <class 'Queue.Empty'>
Empty
Get slept time 10
exception raised <class 'Queue.Empty'>
Empty
0 True
睡觉时间1
从q加上这个q
睡觉时间2
从Q0开始
睡觉时间3
来自Q1
睡觉时间4
来自q 2
睡觉时间5
来自Q3
睡觉时间6
来自Q4
睡觉时间7
提出的例外情况
空的
睡觉时间8
提出的例外情况
空的
睡觉时间9点
提出的例外情况
空的
睡觉时间10点
提出的例外情况
空的
0对
有问题吗?是的,我已经将其转换为字符串,但我一定没有复制该代码并错过转换的位置。但是,即使解决了这个问题,也不能解决为什么我不能在第一个线程之前读取队列中的值thread@tiggles您注意到我所做的更改了吗?是的,现在我看到了,它可以很好地使用.format(q.get(True,1))。我理解为什么我没有看到您得到的错误,因为我没有打印异常输出。我只是在打印“空”。感谢您的帮助,在centos 6.5上使用python 2.6 x64对其进行了测试,我得到了所需的输出。您得到了我得到的输出吗?或者你得到了不同的输出?你能把它寄出去吗?