相关疑难解决方法(0)

在Python中的子进程,多处理和线程之间做出决定?

我想并行化我的Python程序,以便它可以在运行它的机器上使用多个处理器.我的并行化非常简单,因为程序的所有并行"线程"都是独立的,并将它们的输出写入单独的文件.我不需要线程来交换信息,但是我必须知道线程何时完成,因为我的管道的某些步骤依赖于它们的输出.

可移植性很重要,因为我希望在Mac,Linux和Windows上运行任何Python版本.鉴于这些约束,哪个是最适合实现它的Python模块?我试图在线程,子进程和多处理之间做出决定,这些都似乎提供了相关的功能.

有什么想法吗?我想要最简单的便携式解决方案.

python parallel-processing multithreading

103
推荐指数
4
解决办法
4万
查看次数

非阻塞subprocess.call

我正在尝试进行非阻塞子进程调用,以便从我的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进行通信,而这在某些方面我目前并不需要.谁会知道如何以简单的方式实现这一点......?

python subprocess

42
推荐指数
3
解决办法
4万
查看次数

只要一个完成并在队列中启动下一个作业,Python多个子进程就会有一个池/队列恢复输出

我正在启动一个子进程并在运行时解析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个作业池应该是:

  • 启动4个子流程.
  • 当其中一个作业完成后,解析stdout并启动下一个.
  • 执行此操作直到队列中的所有作业完成.

如果我能实现这一点,我真的不知道如何识别哪个样本子流程已完成.此时,我不需要识别它们,因为每个子进程按顺序运行,并且我解析stdout,因为子进程正在打印stdout.

这非常重要,因为我需要识别每个子流程的输出并将其分配给它的相应输入/样本.

python queue parallel-processing subprocess stdout

13
推荐指数
1
解决办法
1万
查看次数

多处理超时?

此代码 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)

更新:虽然我很欣赏关于添加超时到子进程的提示,但问题仍然存在。如何关闭挂起的功能?假设我已将 …

python multithreading python-3.x python-multiprocessing

2
推荐指数
1
解决办法
7796
查看次数