Python:同时运行多个进程

新手上路,请多包涵

我试图在 python 中创建一个程序,它在不同的处理器上同时运行一个函数的多个实例 (15)。我一直在研究这个,并使用 multiprocessing 中的 Process 工具设置了以下程序。

不幸的是,该程序按顺序执行该函数的每个实例(似乎要等待一个实例完成才能进入循环的下一部分)。

 from __future__ import print_function
from multiprocessing import Process
import sys
import os
import re

for i in range(1,16):
    exec("path%d = 0" % (i))
    exec("file%d = open('%d-path','a', 1)" % (i, i))

def stat(first, last):
    for j in range(1,40000):
        input_string = "water" + str(j) + ".xyz.geocard"
        if os.path.exists('./%s' % input_string) == True:
            exec("out%d = open('output%d', 'a', 1)" % (first, first))
            exec('print("Processing file %s...", file=out%d)' % (input_string, first))
            with open('./%s' % input_string,'r') as file:
                for line in file:
                    for i in range(first,last):
                        search_string = " " + str(i) + " path:"
                        for result in re.finditer(r'%s' % search_string, line):
                            exec("path%d += 1" % i)

            for i in range(first,last):
                exec("print(path%d, file=file%d)" % (i, i))

processes = []

for m in range(1,16):
    n = m + 1
    p = Process(target=stat, args=(m, n))
    p.start()
    processes.append(p)

for p in processes:
    p.join()

我对编程相当陌生,没有并行化经验 - 任何帮助将不胜感激。

我已经包含了上面的整个程序,用实际功能替换了“某些功能”,以证明这不是时间问题。该程序可能需要数天才能循环遍历所有 40,000 个文件(每个文件都非常大)。

原文由 user3470516 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

你确定吗?我刚刚试过了,它对我有用;每次执行的结果都是乱序的,所以它们是同时执行的。

看看你的功能。它需要“first”和“last”,那么它的执行时间是否越小值越小?在这种情况下,您可以预期较小编号的参数会降低运行时间,因此它看起来是并行运行的。

 ps ux | grep python | grep -v grep | wc -l
> 16

如果您重复执行代码(即使用 bash 脚本),您可以看到每个进程都在启动。如果您想确认这一点,请导入 os 并打印出函数 os.getpid() 这样您就可以看到它们具有不同的进程 ID。

所以,是的,仔细检查你的结果,因为在我看来你已经同时写好了!

原文由 ruscur 发布,翻译遵循 CC BY-SA 3.0 许可协议

我认为正在发生的事情是你在 some_function 中做得不够,无法观察并行发生的工作。它生成一个进程,并在生成下一个进程之前完成。如果将随机睡眠时间引入 some_function ,您会发现它们实际上是并行运行的。

 from multiprocessing import Process
import random
import time

def some_function(first, last):
    time.sleep(random.randint(1, 3))
    print first, last

processes = []

for m in range(1,16):
   n = m + 1
   p = Process(target=some_function, args=(m, n))
   p.start()
   processes.append(p)

for p in processes:
   p.join()

输出

2 3
3 4
5 6
12 13
13 14
14 15
15 16
1 2
4 5
6 7
9 10
8 9
7 8
11 12
10 11

原文由 mdadm 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题