【发布时间】:2017-08-08 14:42:48
【问题描述】:
`此代码尝试使用队列将任务提供给多个工作进程。
我想计算不同进程数量和不同数据处理方法之间的速度差异。
但是输出并没有像我想象的那样。
from multiprocessing import Process, Queue
import time
result = []
base = 2
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 23, 45, 76, 4567, 65423, 45, 4, 3, 21]
# create queue for new tasks
new_tasks = Queue(maxsize=0)
# put tasks in queue
print('Putting tasks in Queue')
for i in data:
new_tasks.put(i)
# worker function definition
def f(q, p_num):
print('Starting process: {}'.format(p_num))
while not q.empty():
# mimic some process being done
time.sleep(0.05)
print(q.get(), p_num)
print('Finished', p_num)
print('initiating processes')
processes = []
for i in range(0, 2):
if __name__ == '__main__':
print('Creating process {}'.format(i))
p = Process(target=f, args=(new_tasks, i))
processes.append(p)
#record start time
start = time.time()
# start process
for p in processes:
p.start()
# wait for processes to finish processes
for p in processes:
p.join()
#record end time
end = time.time()
# print time result
print('Time taken: {}'.format(end-start))
我预计会这样:
Putting tasks in Queue
initiating processes
Creating process 0
Creating process 1
Starting process: 1
Starting process: 0
1 1
2 0
3 1
4 0
5 1
6 0
7 1
8 0
9 1
10 0
11 1
23 0
45 1
76 0
4567 1
65423 0
45 1
4 0
3 1
21 0
Finished 1
Finished 0
Time taken: <some-time>
但是我实际上得到了这个:
Putting tasks in Queue
initiating processes
Creating process 0
Creating process 1
Time taken: 0.01000523567199707
Putting tasks in Queue
Putting tasks in Queue
initiating processes
Time taken: 0.0
Starting process: 1
initiating processes
Time taken: 0.0
Starting process: 0
1 1
2 0
3 1
4 0
5 1
6 0
7 1
8 0
9 1
10 0
11 1
23 0
45 1
76 0
4567 1
65423 0
45 1
4 0
3 1
21 0
Finished 0
似乎有两个主要问题,我不确定它们的相关性如何:
打印语句,例如:
Putting tasks in Queueinitiating processesTime taken: 0.0通过代码系统地重复 - 我说系统地重复,因为它们每次都准确地重复。第二个进程永远不会结束,它永远不会识别队列是空的,因此无法退出
【问题讨论】:
-
我听起来你的代码格式有问题:你应该只有一个
Time taken:...打印输出。 -
另外你不应该轮询
q.empty(),因为一个贪婪的线程可能会窃取最后一个项目,而让所有其他线程等待永远不会出现的项目。您应该使用的是队列结束标记。每个线程一个。 -
否则这是个好问题。您在编写代码和收集输出方面付出了一些努力并显示了您期望发生的事情。
-
@quamrana 你在哪里对,轮询 q.empty() 是 2 的解决方案
-
你可以是 PEP8 兼容的,但是一个额外的或缺少的缩进可以完全改变一个 python 程序。
标签: python queue multiprocessing