最近,我一直在试验多处理模块。我写了这个脚本来测试它:
import multiprocessing
from time import sleep
import datetime
def b(m):
print(m)
def int_val(a):
b(a)
def char_val(a):
sleep(15)
b(a)
list_val = [1,2,'c',6,10,1,'e',11,78,'a', 'b']
if __name__ == '__main__':
p = multiprocessing.Pool(4)
for index, val in enumerate(list_val):
if isinstance(val, str):
p.map(char_val, [val])
print(datetime.datetime.now())
else:
p.map(int_val, [val])
print(datetime.datetime.now())
输出如下:
1
2020-03-29 01:45:37.099114
2
2020-03-29 01:45:37.099114
c
2020-03-29 01:45:52.114733
6
2020-03-29 01:45:52.114733
10
2020-03-29 01:45:52.114733
1
2020-03-29 01:45:52.114733
e
2020-03-29 01:46:07.115963
11
2020-03-29 01:46:07.115963
78
2020-03-29 01:46:07.115963
a
2020-03-29 01:46:22.117232
b
2020-03-29 01:46:37.118046
如果我们看到输出,程序并没有真正实现我想要的多重处理。
我希望当程序等待元素"c"的15秒时,其他元素会被处理,几乎所有的字符都会同时打印出来。
这可能是个愚蠢的问题,但我真的迷路了!
如有任何帮助,我们将不胜感激!
您正在为列表中的每个元素迭代调用p.map
,因此实际上您正在为每个元素生成一个新的进程。由于p.map
是一个阻塞调用,它实际上是在等待char_val('c')
的执行,然后再继续。
如果你把整个list_val
给p.map()
,你应该得到预期的执行序列
import multiprocessing
from time import sleep
import datetime
def b(m):
print(m)
def int_val(a):
b(a)
def char_val(a):
sleep(15)
b(a)
def f(val):
if isinstance(val, str):
char_val(val)
print(datetime.datetime.now())
else:
int_val(val)
print(datetime.datetime.now())
list_val = [1,2,'c',6,10,1,'e',11,78,'a', 'b']
if __name__ == '__main__':
p = multiprocessing.Pool(4)
p.map(f, list_val)
# for index, val in enumerate(list_val):
# if isinstance(val, str):
# p.map(char_val, [val])
# print(datetime.datetime.now())
# else:
# p.map(int_val, [val])
# print(datetime.datetime.now())
输出:
1
2020-03-29 11:38:15.373607
2
2020-03-29 11:38:15.373764
6
2020-03-29 11:38:15.374008
10
1
2020-03-29 11:38:15.374117
2020-03-29 11:38:15.374108
11
2020-03-29 11:38:15.374233
78
2020-03-29 11:38:15.374438
c
a
2020-03-29 11:38:30.388652
2020-03-29 11:38:30.388761
e
b
2020-03-29 11:38:30.389465
2020-03-29 11:38:30.389566