(多线程-Python)我如何创建一个脚本来运行我通常从两个不同的终端运行的两个脚本?

Posted

技术标签:

【中文标题】(多线程-Python)我如何创建一个脚本来运行我通常从两个不同的终端运行的两个脚本?【英文标题】:(Multithreading-Python) How I can create a script that run two scripts which I usually run from two different terminals? 【发布时间】:2022-01-11 16:14:32 【问题描述】:

我有两个脚本a.pyb.py,它们通过本地主机(mqtt)相互发送数据,它们都依赖于配置文件conf.json。我通常在两个不同的终端执行它们,

a.py 在一个终端中 b.py 在另一个

一切正常。我现在正在尝试创建另一个脚本c.py,它应该执行以下操作:

参数中的参数 更新config.json 在两个不同的终端中执行a.pyb.py 关闭a.pyb.py 并使用新参数重新开始

现在,我对此非常陌生,所以我尝试使用线程中的线程

from threading import Thread

for parameter in parameter 
    #update config.json
    class exp(Thread):
        def __init__(self, name):
            Thread.__init__(self)
            self.name = name
        def run(self):
            if self.name == 0:
               a.runs()
            else:
               b.runs()
    thread1 = exp(0)
    thread1.start()
    thread2 = exp(1)
    thread2.start()

a.py 和 b.py 脚本都以:

结尾
def runs():
    #whatever runs do
if __name__ = 'main':
   runs()

它运行没有错误,但它不起作用。我很确定应该有一个很好的标准解决方案来解决这个问题。有任何想法吗?谢谢!

【问题讨论】:

【参考方案1】:

您可以使用 qt 线程。 Qt 有一个非常强大的库正是为此目的。

【讨论】:

投反对票,因为没有提到标准库中有即时选项。 我会记住,但我更喜欢可用的标准解决方案。谢谢!【参考方案2】:

您可能需要multiprocessing,而不是threading 库(查找multiprocessing.Process。另一个相当等效的选项是使用subprocess.run 通过shell 启动这两个脚本。

关于线程 - 请记住,由于CPython 中的全局解释器锁,它们受到限制 - 这是流行的 python 实现,您可能正在使用。

【讨论】:

谢谢!我今天会尝试并发送更新。 所以我尝试用 subprocess.Popen 调用这两个脚本,但仍然没有得到正确的结果。我认为有一些同步问题。 a.py 应该将输出发送到运行的 b.py,然后将输出发送到 a.py 等……但由于某种原因,这个过程似乎是妥协,同时如果我运行这两个脚本没有问题两个不同的终端。 另外,有没有办法在两个不同的终端显示两个脚本的输出? 您可以通过重定向或在完成的进程返回值中捕获输出。不确定“将输出发送到”是什么意思 - 要让进程相互通信,您通常希望使用某种形式的 IPC,具体取决于您的用例。据我所知,您没有在 OP 中提及它 - 如果确实是这种情况,您应该在那里更新它,并且对于解决方案来说是必不可少的。【参考方案3】:

所以我最终找到了这个(肮脏的)解决方案……有什么改进建议吗?

p = subprocess.Popen(['python', 'random.py']) #initialize a random process just to make sense of the firsts terminate calls in the for cycle. 
for parameter in parameters
    subprocess.Popen.terminate(p)
    #random code
     p = subprocess.Popen(['python', 'a.py'])
     p = subprocess.call(['python', 'b.py'])
    #here I would like to do
    #subprocess.Popen.terminate(p)....but it does not work, so I putted the terminate process at the start of the for cycle

我不完全理解我写的内容,但它工作正常。感谢大家之前的提示,我希望进一步的解释。

【讨论】:

感谢您更新您的解决方案。您应该将其标记为已接受,以便它首先显示给后续用户。根据文档,新接口是 subprocess.run,而不是我之前写的 subprocess.call - 比 Popen 更喜欢它。没有理由混用 run 和 Popen。没有理由 Popen 和终止进程。您可能想要使用 shell=True。 请注意,调用进程是一种非常标准且运行良好的功能。因此,任何错误或肮脏的解决方案通常是由于您对 API 的使用不当......您可以尝试详细说明在您的原始帖子中您在进程之间的通信方面需要什么,以便有一个更清洁的解决方案。

以上是关于(多线程-Python)我如何创建一个脚本来运行我通常从两个不同的终端运行的两个脚本?的主要内容,如果未能解决你的问题,请参考以下文章

Python 线程处理 - join() - 多线程

多线程 python 脚本静默死亡 - 如何调试

在 Python 脚本中同时使用多处理和多线程来加快执行速度

Python多处理:如何创建x个进程并返回返回值

如何让 Python 多线程管道使用 90% 的可用内存?

boost.python 真正的多线程