python 的 IPC 机制
IPC mechanisms for python
A 和 B 是同一目录中的两个 python 程序。当前程序 A 是 运行,现在程序 B 将使用以下指令从 A 执行。
os.system("python B.py & echi $!")
'A'要执行100多次'B',但有时B会在中间挂掉,所以当时没法继续整个操作。现在我想要一个 IPC 机制来查找 'B' 是否被击中,如果被击中那么我可以自动终止该进程并重新开始。
注意:我不想使用 mmap、files、pickle
代替 os.system,您可以使用 subprocess.Popen 创建一个子进程,然后使用 subprocess.Popen.poll 以特定的时间间隔检查子进程是否已完成。如果不是,您可以使用 subprocess.Popen.kill 杀死它。例如,您可以将其包装在这样的函数中。
import subprocess
import threading
import time
def process(*args):
return_code, threshold = None, 5
def reader():
try:
while 1:
process.status_check_time = time.time()
process.process.stdout.readline()
except:
pass
try:
return_code = process.process.poll()
curr_time = time.time()
if return_code != None:
raise Exception()
if curr_time - process.status_check_time > threshold:
process.process.kill()
raise Exception()
except:
process.process = subprocess.Popen(args, bufsize = 0, shell = False, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
(threading.Thread(target = reader)).start()
return return_code
现在调用 process('/path/to/your/program')
应该根据给定的阈值(在本例中为 5 秒)(重新)启动您的程序。为避免重新启动,子进程应每 5 秒向 stdout/stderr 打印一些内容。
A 和 B 是同一目录中的两个 python 程序。当前程序 A 是 运行,现在程序 B 将使用以下指令从 A 执行。
os.system("python B.py & echi $!")
'A'要执行100多次'B',但有时B会在中间挂掉,所以当时没法继续整个操作。现在我想要一个 IPC 机制来查找 'B' 是否被击中,如果被击中那么我可以自动终止该进程并重新开始。
注意:我不想使用 mmap、files、pickle
代替 os.system,您可以使用 subprocess.Popen 创建一个子进程,然后使用 subprocess.Popen.poll 以特定的时间间隔检查子进程是否已完成。如果不是,您可以使用 subprocess.Popen.kill 杀死它。例如,您可以将其包装在这样的函数中。
import subprocess
import threading
import time
def process(*args):
return_code, threshold = None, 5
def reader():
try:
while 1:
process.status_check_time = time.time()
process.process.stdout.readline()
except:
pass
try:
return_code = process.process.poll()
curr_time = time.time()
if return_code != None:
raise Exception()
if curr_time - process.status_check_time > threshold:
process.process.kill()
raise Exception()
except:
process.process = subprocess.Popen(args, bufsize = 0, shell = False, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
(threading.Thread(target = reader)).start()
return return_code
现在调用 process('/path/to/your/program')
应该根据给定的阈值(在本例中为 5 秒)(重新)启动您的程序。为避免重新启动,子进程应每 5 秒向 stdout/stderr 打印一些内容。