Python 多进程-如何并行运行多个进程

Python 多进程-如何并行运行多个进程,python,multiprocessing,Python,Multiprocessing,最近,我一直在试验多处理模块。我编写此脚本是为了测试它: 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_

最近,我一直在试验多处理模块。我编写此脚本是为了测试它:

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\u val('c')

如果您将整个
列表值
赋给
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