多处理和队列

时间:2017-08-08 14:42:49

标签: python queue multiprocessing

`此代码尝试使用队列任务提供给数字工作进程

我想计算不同数量的流程和处理数据的不同方法之间的速度差异。

但是输出没有达到我想象的效果。

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

似乎有两个主要问题,我不确定它们有多相关:

  1. 打印陈述如: Putting tasks in Queue initiating processes Time taken: 0.0 虽然在代码中有系统地重复 - 我系统地说,因为它们每次都重复。

  2. 第二个进程永远不会完成,它永远不会识别出队列是空的,因此无法退出

1 个答案:

答案 0 :(得分:1)

你的工作线程应该是这样的:

click.trigger

队列应该在真实数据之后填充标记:

def f(q, p_num):
    print('Starting process: {}'.format(p_num))
    while True:
        value = q.get()
        if value is None:
            break
        # mimic some process being done
        time.sleep(0.05)
        print(value, p_num)
    print('Finished', p_num)