我想并行化我的Python程序,以便它可以在运行它的机器上使用多个处理器.我的并行化非常简单,因为程序的所有并行"线程"都是独立的,并将它们的输出写入单独的文件.我不需要线程来交换信息,但是我必须知道线程何时完成,因为我的管道的某些步骤依赖于它们的输出.
可移植性很重要,因为我希望在Mac,Linux和Windows上运行任何Python版本.鉴于这些约束,哪个是最适合实现它的Python模块?我试图在线程,子进程和多处理之间做出决定,这些都似乎提供了相关的功能.
有什么想法吗?我想要最简单的便携式解决方案.
我正在尝试进行非阻塞子进程调用,以便从我的main.py程序运行slave.py脚本.我需要将args从main.py传递给slave.py一旦它(slave.py)首次通过subprocess.call启动,此slave.py运行一段时间然后退出.
main.py
for insert, (list) in enumerate(list, start =1):
sys.args = [list]
subprocess.call(["python", "slave.py", sys.args], shell = True)
{loop through program and do more stuff..}
Run Code Online (Sandbox Code Playgroud)
还有我的奴隶剧本
slave.py
print sys.args
while True:
{do stuff with args in loop till finished}
time.sleep(30)
Run Code Online (Sandbox Code Playgroud)
目前,slave.py阻止main.py运行其余的任务,我只想让slave.py独立于main.py,一旦我将args传递给它.这两个脚本不再需要通信.
我在网上发现了一些关于非阻塞subprocess.call的帖子,但是大多数帖子都集中在需要与slave.py进行通信,而这在某些方面我目前并不需要.谁会知道如何以简单的方式实现这一点......?
我正在启动一个子进程并在运行时解析stdout而不必等待它完成解析stdout.
for sample in all_samples:
my_tool_subprocess = subprocess.Popen('mytool {}'.format(sample),shell=True, stdout=subprocess.PIPE)
line = True
while line:
myline = my_tool_subprocess.stdout.readline()
#here I parse stdout..
Run Code Online (Sandbox Code Playgroud)
在我的脚本中,我多次执行此操作,实际上取决于输入样本的数量.
这里的主要问题是每个子进程都是一个程序/工具,它在运行时使用1个CPU 100%.这需要一些时间......每次输入可能需要20-40分钟.
我想什么来实现的,是设置一个游泳池,队列(我不知道这是怎么确切的术语)在同时运行N最大的子进程的工作过程.所以我可以最大化性能,而不是按顺序进行.
因此,执行流程,例如最多4个作业池应该是:
如果我能实现这一点,我真的不知道如何识别哪个样本子流程已完成.此时,我不需要识别它们,因为每个子进程按顺序运行,并且我解析stdout,因为子进程正在打印stdout.
这非常重要,因为我需要识别每个子流程的输出并将其分配给它的相应输入/样本.
此代码 ping 各种机器。您能否帮我更改此代码,以便如果 ping 进程挂起超过 7 秒,它会关闭并返回一些标志?
(我想从使用 WMI 的机器中提取各种数据。为此,我将 ping 功能更改为其他功能。问题是在某些机器上 WMI 已损坏并且提取数据的过程无限期挂起。需要超时。)
import multiprocessing.dummy
import subprocess
import numpy as np
import time
start_time = time.time()
def ping(ipadd):
try:
response = subprocess.check_output(['ping', ipadd])
return True
except subprocess.CalledProcessError as e:
return False
#print(ping('10.25.59.20'))
machine_names = \
'''
ya.ru
microsoft.com
www.google.com
www.amazon.com
www.nasa.com
'''.split()
np_machine_names = np.array(machine_names)
p = multiprocessing.dummy.Pool(7)
ping_status = p.map(ping, machine_names)
np_ping_status = np.fromiter(ping_status, dtype=bool)
print(*np_machine_names[np_ping_status], sep = '\n')
run_time = time.time() - start_time
print(f'Runtime: {run_time:.0f}')
Run Code Online (Sandbox Code Playgroud)
更新:虽然我很欣赏关于添加超时到子进程的提示,但问题仍然存在。如何关闭挂起的功能?假设我已将 …