Python 3.6:如何在多进程中从函数(生成器)生成多个外部 exe 实例



如何以多处理方式从函数(生成器)for x1 in x:生成多个并行外部exe实例(以保持每个CPU线程始终运行一个exec)?如果在下面的当前伪代码中没有方法可以做到这一点,那么还有什么其他最佳/简单的解决方案?

顺便说一句,在exec实例退出后,我需要获取输出的文件大小并删除它。 代码的目的是找到 x/y/z 参数的理想组合,

os.system行语法不正确,以提高可读性。state_x = x1/z1后面会有更多的代码,如exitcode check,getfilesize和compare,所以x1x2x3并不总是传递给变量。

x = list(range(1, 300+1))
y = list(range(1, 300+1))
z = list(range(1, 300+1))
state_x = []
state_y = []
state_z = []
import os
for x1 in x:
for y1 in y:
for z1 in z:
os.system("external.exe -x1 -y1 -z1 outfile_x1_y1_z1.out")
state_x = x1
state_y = y1
state_z = z1

UPDATE1

我进一步简化了代码以使其更易于理解,os.system("external.exe...替换为print,以便从 shell 输出中更清楚地了解代码的作用。

忽略state_* = []变量总是从生成器获得最后一个循环变化,它只是简化的代码和预期的结果 - 签署代码有效!

问题仍然相同,如何从循环生成器在多进程中生成执行/打印。

x = list(range(1,2+1))
y = list(range(3,4+1))
z = list(range(5,6+1))
state_x = []
state_y = []
state_z = []
import os
for x1 in x:
for y1 in y:
for z1 in z:
print (x1,y1,z1)
state_x = x1
state_y = y1
state_z = z1

外壳输出:

==================== RESTART: D:/Python36-32/myscript5.py ==============
1 3 5
1 3 6
1 4 5
1 4 6
2 3 5
2 3 6
2 4 5
2 4 6
>>> state_x
2
>>> state_y
4
>>> state_z
6
>>> 

UPDATE2:

如果从 IDLE 运行,下面的这段代码会启动外部 exe 多处理,但我没有得到变量state_xstate_ystate_z从函数传递到全局变量。代码完成后,我在 Python Shell 中键入state_x我返回空[]

法典:

import itertools
import multiprocessing
import os
x = list(range(1,2+1))
y = list(range(3,4+1))
z = list(range(5,6+1))
state_x = []
state_y = []
state_z = []
def do_work(x1, y1, z1):
os.system("ping.exe 127.0.0.1 -n "+str(x1)+"")
global state_x  
state_x = x1
global state_y 
state_y = y1
global state_z
if __name__ == "__main__":
with multiprocessing.Pool() as pool:
results = pool.starmap(do_work, itertools.product(range(1,3),range(3,5),range(5,7), repeat=1))

当您希望每个 CPU 有一个进程时,通常最好的方法是使用multiprocessing.Pool.我认为这应该大致可以满足您的需求(代码逻辑的确切细节并不明显,因为您在每次迭代时都会覆盖state_x/y/z,没有明显效果)。

import itertools
import multiprocessing
def do_work(x, y, z):
# do your per-job stuff here, e.g. make the os.system() call, or whatever
return result # return whatever value you need the worker to send to the main process
if __name__ == "__main__":
with multiprocessing.Pool() as pool:
results = pool.starmap(do_work, itertools.product(range(1, 301), repeat=3))
# do stuff with results here

默认情况下,不带参数创建的Pool将为每个 CPU 内核创建一个进程。如果您愿意,可以告诉它使用不同数量的进程,但在大多数情况下,这不是必需的。

最新更新