- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个 Python 脚本可以启动这样的任务:
import os
os.system("./a.sh")
do_c()
a.sh
是一个启动其他程序的 bash 脚本。 bash 脚本本身似乎在所有启动的脚本都准备好之前就准备好了。
do_c()
之前等待所有脚本(子进程)准备就绪被处决?
a.py
和
b.py
拿。
#!/usr/bin/env python
import os
from time import sleep
print("Started run.py")
os.system("./a.py")
print("a is ready.")
print("Now all messages should be there.")
sleep(30)
#!/usr/bin/env python
import subprocess
import sys
print(" Started a.py")
pid = subprocess.Popen([sys.executable, "b.py"])
print(" End of a.py")
#!/usr/bin/env python
from time import sleep
print(" Started b.py")
sleep(10)
print(" Ended b.py")
Now all messages should be there.
.
started run.py
Started a.py
End of a.py
a is ready.
Now all messages should be there.
Started b.py
Ended b.py
最佳答案
处理这种情况的常用方法不起作用。等待 a.py
(这是 os.system
默认情况下)不起作用,因为 a.py
在其子进程执行完毕之前退出。查找 b.py
的 PID很棘手,因为,一旦 a.py
退出,b.py
不能再以任何方式连接到它 - 即使是 b.py
的父 PID是 1,init
过程。
然而,有可能利用继承的文件描述符作为 child 死亡的穷人信号。设置一个管道,其读端在run.py
,其写端由a.py
继承和它所有的 child 。只有当最后一个 child 退出时,管道的写端才会关闭,并且出现 read()
在管道的读取端将停止阻塞。
这是run.py
的修改版实现这个想法,显示所需的输出:
#!/usr/bin/env python
import os
from time import sleep
print("Started run.py")
r, w = os.pipe()
pid = os.fork()
if pid == 0:
os.close(r)
os.execlp("./a.py", "./a.py")
os._exit(127) # unreached unless execlp fails
os.close(w)
os.waitpid(pid, 0) # wait for a.py to finish
print("a is ready.")
os.read(r, 1) # wait for all the children that inherited `w` to finish
os.close(r)
print("Now all messages should be there.")
a.py
产生的所有进程继承。 .这些进程不需要知道关于这个文件描述符的任何事情,唯一重要的是当它们都死了时,管道的写端就会关闭。这将在管道的读取端通过
os.read()
指示不再阻塞并返回表示文件结束条件的 0 长度字符串。
os.pipe()
之间的部分和第一个 print
是 os.system()
的实现,不同之处在于它关闭了 child 管道的读取端。 (这是必要的——简单地调用 os.system()
将使读取端保持打开状态,这将阻止父级中的最终读取正常工作。)os.fork()
复制当前进程,唯一区分父进程和子进程的方法是 家长 你得到子PID(并且子得到0,因为它总是可以使用os.getpid()
找出它的PID)。 if pid == 0:
分支在子进程中运行,只有 execs ./a.py
. “Exec”意味着它运行指定的可执行文件而不返回。 os._exit()
只有在这种情况下才存在 execlp
失败(在 Python 中可能是不必要的,因为 execlp
的失败会引发一个异常,该异常会退出程序,但仍然如此)。程序的其余部分在父级中运行。 os.waitpid(pid)
是等待a.py
通常由 os.system()
执行.在我们的例子中,没有必要拨打 waitpid
,但这样做是一个好主意,以防止僵尸留下。 os.read(r, 1)
这就是魔法发生的地方:它尝试从管道的读取端读取最多 1 个字符。由于从来没有人向管道的写端写入数据,因此读取将阻塞,直到管道的写端关闭。由于a.py
的 child 对继承的文件描述符一无所知,关闭它的唯一方法是内核在相应进程死亡后执行此操作。当所有继承的写结束描述符都关闭时,os.read()
返回一个零长度的字符串,我们忽略它并继续执行。 关于python - 如何等待子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22514121/
我试图让脚本暂停大约 1 秒,然后继续执行脚本,但我似乎无法弄清楚如何做。这是我的代码: function hello() { alert("Hi!") //I need about a 1
wait() 和 wait(timeout) 之间有什么区别。无论如何 wait() 需要等待通知调用,但为什么我们有 wait(timeout)? 那么 sleep(timeout) 和 wait(
我需要做什么: 我有一个带有文件输入和隐藏文本输入的上传表单。用户上传图像,图像被操作,然后发送到远程服务器进行处理,这需要几秒钟,然后远程服务器将最终的图像发送回家庭服务器,并保存在新文件夹中。 J
大家好,我正在使用 Visual C++ 2010,尝试使用 Winsock 编写服务器/客户端应用程序...我不确定为什么,但有时服务器会在 listen() 函数处等待,有时会在 accept 处
任务描述 我为我的 Angular 应用程序实现了 CRSF 保护。服务器检查 crsf token 是否位于请求的 header “X-CSRF-TOKEN”中。如果不是,它会发送一个 HTTP 响
我想做这个例子https://stackoverflow.com/a/33585993/1973680同步。 这是正确的实现方式吗? let times= async (n,f)=>{
我如何将 while 循环延迟到 1 秒间隔,而不会将其运行的整个代码/计算机的速度减慢到一秒延迟(只是一个小循环)。 最佳答案 Thread.sleep(1000); // do nothing f
我知道这是一个重复的问题。但是我无法通过解释来理解。我想用一个很好的例子来清楚地理解它。任何人都可以帮忙吗。 “为什么我们从同步上下文中调用 wait()、notify() 方法”。 最佳答案 当我们
我有一个 click 事件,该事件是第一次从另一个地方自动触发的。我的问题是它运行得太快,因为所需的变量仍在由 Flash 和 Web 服务定义。所以现在我有: (function ($) {
我有如下功能 function async populateInventories(custID){ this.inventories = await this.inventoryServic
我一直对“然后”不被等待的行为感到困扰,我明白其原因。然而,我仍然需要绕过它。这是我的用例。 doWork(family) { return doWork1(family)
我想我理解异步背后的想法,返回一个Future,但是我不清楚异步在一个非常基本的层面上如何表现。据我了解,它不会自动在程序中创建异步行为。例如: import 'dart:async'; main()
我正在制作一个使用异步的Flutter应用程序,但它的工作方式不像我对它的了解。所以我对异步和在 Dart 中等待有一些疑问。这是一个例子: Future someFunction() async {
我在 main.tf 中创建资源组和 vNet,并在同一文件中引用模块。问题是,模块无法从模块访问这些资源。相关代码(删除了大部分代码,只留下相关部分): main.tf: module "worke
我的代码的问题是,当代码第一次运行时,我试图获取的 dom 元素并不总是存在,如果它不存在,那么永远不会做出 promise 。 我是否可以等到 promise 做出后再尝试实现它? 我希望我的最后一
所以,过去几天我一直在研究这段代码,并尝试实现回调/等待/任何需要的东西,但没有成功。 问题是,我如何等待响应,直到我得到两个函数的回调? (以及我将如何实现) 简而言之,我想做的是: POST 发生
谁能帮我理解这一点吗? 如果我们有一个类: public class Sample{ public synchronized method1(){ //Line1 .... wait();
这是我编写的代码,用于测试 wait() 和 notify() 的工作。现在我有很多疑问。 class A extends Thread { public void run() { try
我有以下代码由于语法错误而无法运行(在异步函数外等待) 如何使用 await 定义变量并将其导出? 当我这样定义一个变量并从其他文件导入它时,该变量是只创建一次(第一次读取文件时?)还是每次导入时都创
一个简单的线程程序,其中写入器将内容放入堆栈,读取器从堆栈中弹出。 java.util.Stack; import java.util.concurrent.ExecutorService; impo
我是一名优秀的程序员,十分优秀!