当前位置: 首页 > 知识库问答 >
问题:

非阻塞子流程。呼叫

慕嘉茂
2023-03-14

我试图做一个非阻塞子进程调用,从我的main.py程序运行slave.py脚本。我需要通过args从main.pyslave.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..}

还有我的奴隶剧本

slave.py
print sys.args
while True:
    {do stuff with args in loop till finished}
    time.sleep(30)

现在是奴隶。py块主要。py从运行它的其余任务开始,我只需要一个slave。py独立于main。py,一旦我把args传递给它。这两个脚本不再需要通信。

我在网上找到了一些关于非阻塞子流程的帖子。呼叫,但大多数都集中在要求与从机通信上。py在我目前不需要的某个点上。有人知道如何以一种简单的方式实现这一点吗。。。?

共有3个答案

黄飞翮
2023-03-14

对于Python3.8。十、

import shlex
import subprocess

cmd = "<full filepath plus arguments of child process>"
cmds = shlex.split(cmd)
p = subprocess.Popen(cmds, start_new_session=True)

这将允许父进程退出,同时子进程继续运行。对僵尸不太清楚。

在Python3.8上测试。1在macOS 10.15上。5.

施恩
2023-03-14

这里有三个层次的彻底性。

正如mgilson所说,如果您只是调出子流程。调用子流程的。Popen,保持其他内容不变,然后是main。py不会等待从机。请在继续之前完成。这本身就足够了。如果您关心挂起的僵尸进程,那么应该保存从子进程返回的对象。Popen并在稍后调用其wait方法。(当main.py退出时,僵尸将自动消失,因此如果main.py运行很长时间和/或可能创建许多子流程,这只是一个严重的问题。)最后,如果您不想要一个僵尸,但也不想决定在何处等待(如果两个进程都运行了很长一段不可预测的时间,这可能是合适的),请使用python守护程序库使从进程与主进程解除关联——在这种情况下,您可以继续使用子进程。在主机中调用

乌鸿宝
2023-03-14

您应该使用子进程。popen而不是subprocess.call

比如:

subprocess.Popen(["python", "slave.py"] + sys.argv[1:])

子流程的文档中。呼叫

运行args描述的命令。等待命令完成,然后返回returncode属性。

(如果要使用shell=True,也不要使用列表传递参数)。

下面是一个MCVE1示例,演示了一个非阻塞的supprocess调用

import subprocess
import time

p = subprocess.Popen(['sleep', '5'])

while p.poll() is None:
    print('Still sleeping')
    time.sleep(1)

print('Not sleeping any longer.  Exited with returncode %d' % p.returncode)

另一种依赖于最近对python语言的更改以允许基于协同例程的并行性的方法是:

# python3.5 required but could be modified to work with python3.4.
import asyncio

async def do_subprocess():
    print('Subprocess sleeping')
    proc = await asyncio.create_subprocess_exec('sleep', '5')
    returncode = await proc.wait()
    print('Subprocess done sleeping.  Return code = %d' % returncode)

async def sleep_report(number):
    for i in range(number + 1):
        print('Slept for %d seconds' % i)
        await asyncio.sleep(1)

loop = asyncio.get_event_loop()

tasks = [
    asyncio.ensure_future(do_subprocess()),
    asyncio.ensure_future(sleep_report(5)),
]

loop.run_until_complete(asyncio.gather(*tasks))
loop.close()

1使用python2在OS-X上测试。7.

 类似资料:
  • 我完全混淆了,,。 哪个是阻塞,哪个不是? 我的意思是如果我使用父进程是否等待子进程返回/才继续执行。 如何影响这些调用?

  • 我想知道正常的java API调用(我的意思是没有I/O的方法)是否应该被线程化为“迷你阻塞调用”?是否可以像这样实现Reactive Streams(在返回Publisher之前调用方法): 而不是(在流中调用它) 此验证器仅用于示例。这种方法是否有任何缺点,或者这些方法在返回语句之前应该总是包含在流中?

  • 非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 ServletInputStream.setReadListener 或ServletOutputStream.setWriteListener 方法时将抛出IllegalStateException。为了支持在 Ser

  • Web 容器中的非阻塞请求处理有助于提高对改善 Web 容器可扩展性不断增加的需求,增加 Web 容器可同时处理请求的连接数量。servlet 容器的非阻塞 IO 允许开发人员在数据可用时读取数据或在数据可写时写数据。非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 S

  • 问题内容: 我在获取ncurses的getch()阻止时遇到了一些问题。默认操作似乎是非阻塞的(或者我错过了一些初始化)?我希望它可以像Windows中的getch()一样工作。我尝试了各种版本的 (并非同时全部)。如果可能的话,我宁愿不(明确地)使用any 。一个围绕残培环路(),检查特定的返回值是OK了。 问题答案: curses库是一揽子交易。如果不正确初始化库,您不能仅仅提出一个例程并希望

  • 问题内容: 有没有一种方法可以以非阻塞方式使用python的socket.accept()来简单地运行它,并让我检查它是否有任何新连接?我 真的 不想使用线程。谢谢。 问题答案: 您可能想要类似的东西(请参阅文档)。您提供了三个套接字列表:您要监视其可读性,可写性和错误状态的套接字。当新的客户端正在等待时,服务器套接字将是可读的。 该功能将一直阻塞,直到套接字状态之一改变为止。如果您不想永远阻塞,