【问题标题】:Multiprocessing - how to run multiple processes in parallel多处理 - 如何并行运行多个进程
【发布时间】:2020-07-09 15:32:13
【问题描述】:

最近,我一直在试验多处理模块。我写了这个脚本来测试它:

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 秒时,其他元素将被处理并且几乎所有字符都将同时打印。

这可能是一个愚蠢的问题,但我真的迷路了!

任何帮助将不胜感激!

【问题讨论】:

    标签: python multiprocessing


    【解决方案1】:

    您正在为列表中的每个元素迭代调用p.map,因此本质上您正在为每个元素生成一个新进程。由于p.map 是一个阻塞调用,它实际上是在等待char_val('c') 的执行,然后再继续。

    如果你把整个list_valp.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
    

    【讨论】:

      猜你喜欢
      • 2013-01-24
      • 2022-01-25
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      相关资源
      最近更新 更多