Python 试图使两个子进程共享处理同一资源的负载时出现问题

Python 试图使两个子进程共享处理同一资源的负载时出现问题,python,process,multiprocessing,python-multiprocessing,Python,Process,Multiprocessing,Python Multiprocessing,我在摆弄python多处理模块。但有些事情并没有像我期望的那样起作用,所以现在我有点困惑 在python脚本中,我创建了两个子进程,因此它们可以使用相同的资源。我原以为他们将或多或少地“共享”负载,但似乎不是这样做,而是其中一个进程只执行一次,而另一个进程几乎处理所有事情 为了测试它,我编写了以下代码: #/usr/bin/python 导入操作系统 导入多处理 #工人职能 def工作者(队列A、队列B): 而(queueA.qsize()!=0): item=queueA.get() item

我在摆弄python多处理模块。但有些事情并没有像我期望的那样起作用,所以现在我有点困惑

在python脚本中,我创建了两个子进程,因此它们可以使用相同的资源。我原以为他们将或多或少地“共享”负载,但似乎不是这样做,而是其中一个进程只执行一次,而另一个进程几乎处理所有事情

为了测试它,我编写了以下代码:

#/usr/bin/python
导入操作系统
导入多处理
#工人职能
def工作者(队列A、队列B):
而(queueA.qsize()!=0):
item=queueA.get()
item=“item:”+item+“.processed by worker”+str(os.getpid())
队列B.put(项目)
返回
#工控机经理
manager=multiprocessing.manager()
queueA=多处理。队列()
queueB=多处理。队列()
#用数据填充队列A
对于范围(0,10)内的i:
queueA.put(“你好”+str(i+1))
#创建流程
process1=多处理。进程(目标=工作者,参数=(队列A,队列B,)
process2=多处理。进程(目标=工作者,参数=(队列A,队列B,)
#呼叫过程
process1.start()
process2.start()
#等待进程停止处理
process1.join()
process2.join()
对于范围(0,queueB.qsize())中的i:
打印队列b.get()
并打印以下内容:

item: hello1. processed by worker 11483
item: hello3. processed by worker 11483
item: hello4. processed by worker 11483
item: hello5. processed by worker 11483
item: hello6. processed by worker 11483
item: hello7. processed by worker 11483
item: hello8. processed by worker 11483
item: hello9. processed by worker 11483
item: hello10. processed by worker 11483
item: hello2. processed by worker 11482
如您所见,其中一个进程只处理其中一个元素,它不会继续获取队列中的更多元素,而另一个进程必须处理其他所有元素


我认为这是不正确的,或者至少不是我所期望的。你能告诉我实现这个想法的正确方法是什么吗?

你是对的,它们并不完全相等,但主要是因为你的测试样本太小了。每个流程都需要时间来启动和开始处理。处理队列中的一个项目所需的时间极低,因此一个项目可以在另一个项目通过之前快速处理9个项目

我在下面测试了它(在Python3中,但它也应该适用于2.7,只需将
print()
函数更改为
print
语句):

导入操作系统
导入多处理
#工人职能
def工作者(队列A、队列B):
对于iter中的项目(queueA.get,“STOP”):
out=str(os.getpid())
队列B.输出(out)
返回
#工控机经理
manager=multiprocessing.manager()
queueA=多处理。队列()
queueB=多处理。队列()
#用数据填充队列A
对于范围(0,1000)内的i:
queueA.put(“你好”+str(i+1))
#创建流程
process1=多处理。进程(目标=工作者,参数=(队列A,队列B,)
process2=多处理。进程(目标=工作者,参数=(队列A,队列B,)
#呼叫过程
process1.start()
process2.start()
queueA.put('STOP')
queueA.put('STOP')
#等待进程停止处理
process1.join()
process2.join()
全部={}
对于范围(1000)内的i:
item=queueB.get()
如果项目不是全部:
全部[项目]=1
其他:
所有[项目]+=1
打印(全部)
我的输出(每个进程完成了多少次的计数):

虽然它们并不完全相同,但当我们接近更长的时间时,它们将接近相等

编辑:
另一种确认方法是在worker函数中添加
time.sleep(3)

def工作者(队列A、队列B):
对于iter中的项目(queueA.get,“STOP”):
时间。睡眠(3)
out=str(os.getpid())
队列B.输出(out)
返回
我运行了一个
范围(10)
测试,就像您的原始示例一样,得到:

{'18428': 5,
 '18429': 5}

如果我的回答澄清了问题,请将其标记为已接受,如果您仍然有顾虑,请让我知道,我将尝试解决这些问题。谢谢您,长颈鹿91!你的回答确实消除了我的疑虑,我心里没有“开始时间”。还有,很抱歉耽搁了!我在一个大学作业中工作,你帮我节省了很多时间在谷歌上搜索和试图弄清楚发生了什么。问候:)没问题。只是想确定你看到了答案。很多人都会问问题,但从不回答或标记他们的答案。很高兴这有助于澄清事实:)
{'18428': 5,
 '18429': 5}