【问题标题】:Force python subprocesses to run in specific order强制 python 子进程以特定顺序运行
【发布时间】:2019-02-18 22:43:40
【问题描述】:

我有一个程序,我需要两个进程同时运行,一个进程需要在另一个进程之前启动。根据我在脚本中的进度以及在某些进程中发生的错误等因素,还涉及其他子进程,但在主要两个进程正在运行时,这些子进程都不需要运行。

sys.stdout.flush()

proc1 = subprocess.Popen(<command line tool>, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
proc1_data, proc1_stderr = proc1.communicate() 
time.sleep(0.1) # allow time proc1 to kick in

proc2 = subprocess.Popen(<command line tool>, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
proc2_data, proc2_stderr = proc2.communicate() 

proc2.wait()
proc1.kill()
proc2.kill()

# do error checking among other things in other subprocesses based on this data

这在某些时候有效,但通过查看在 proc1 和 proc2 期间打开的硬件上的 LED,我可以看到它们有时不同步,因为 proc2 有时会在 proc1 开启之前运行并完成。

有什么方法可以确保流程按顺序启动?并且那个 proc2 在 proc1 完成之前运行?

【问题讨论】:

    标签: python multithreading subprocess


    【解决方案1】:

    一旦启动,子流程就是独立的实体,它们会以他们想要的任何速度运行。您无法控制每个子进程内部发生的事情 - 除非您在它们之间使用某种形式的进程间通信 (IPC)。

    尚不完全清楚您要在这里做什么,但如果您不希望子进程 2 通过特定检查点,直到子进程 1 通过自己的检查点,那么 IPC 正是您需要的.如果您使用的是 Unix-ish 系统(包括 macOS),您可以使用 semaphore:让子进程 2 调用 sem_wait 阻塞,直到子进程 1 调用 sem_post。 Windows 有一个非常相似的概念。

    【讨论】:

    • 我唯一的要求是进程 2 仅在进程 1 运行时运行,或者至少在进程 1 启动后启动。进程 1 通过 USB 向硬件设备发送数据 x 秒,进程 2 通过 USB 从另一个依赖于第一个硬件设备状态的硬件设备读取数据。
    猜你喜欢
    • 2013-11-13
    • 1970-01-01
    • 2013-02-01
    • 2022-08-19
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    相关资源
    最近更新 更多