从并行运行脚本更新值的最佳方法-Python

从并行运行脚本更新值的最佳方法-Python,python,multithreading,concurrency,python-asyncio,Python,Multithreading,Concurrency,Python Asyncio,我有两个Python脚本(假设脚本1和脚本2)Script_1使用subprocess扫描网络,以调用一些例程,并更新某些值。它的更新速度很慢。它也可以在自己的进程上无限期运行,而不是被调用脚本_2有一个主循环,执行许多不同的操作,一些操作取决于脚本_1更新的值的最新状态。以下是不应该这样做的方法: 脚本1### 从时间上导入睡眠 随机输入 #这也可能是一个无限运行的过程 #独立任务,更新文件/数据库/任何内容 定义冗长的任务(): 睡眠(10)#努力工作。。。 value=random.ran

我有两个Python脚本(假设脚本1脚本2Script_1使用
subprocess
扫描网络,以调用一些例程,并更新某些值。它的更新速度很慢。它也可以在自己的进程上无限期运行,而不是被调用脚本_2有一个主循环,执行许多不同的操作,一些操作取决于脚本_1更新的值的最新状态。以下是不应该这样做的方法:

脚本1###
从时间上导入睡眠
随机输入
#这也可能是一个无限运行的过程
#独立任务,更新文件/数据库/任何内容
定义冗长的任务():
睡眠(10)#努力工作。。。
value=random.random()*10
返回值
###脚本2###
从脚本\u 1导入繁琐的\u任务
从时间上导入睡眠
尽管如此:
值=冗长的任务()#等待。。。
如果值>5:
打印(“做某事”)
其他:
打印(“做其他事情”)
打印(“做其他事情”)
睡眠(1)
作为补充说明,我不关心记录script_1的更新值。我只需要最新的值

我想到了几种不同的实现方法,例如中断/回调、异步、线程、多处理,甚至在文件、数据库等外部位置上进行写入。然而,大多数方法都是技术过度,其余的都不理想

线程是一个潜在的候选。我很喜欢使用线程,但是我已经读了很多关于如果没有正确实现它会如何破坏系统的稳定性的书,我需要这个系统在很长一段时间内保持稳定。“在可能的时候使用异步IO;在必须的时候使用线程”,我在某处读到

异步IO感觉有点过分(不如使用数据库),但我可能弄错了。我已经很多年没有使用异步任务了(在Python中也从未使用过),所以我已经忘记了它的大部分内容。我主要担心的是,由于我只需要返回最后一个值,如果我的主例程由于某种原因而变慢,它将导致异步函数的一系列延迟返回。我可能遗漏了什么

那么,有没有更好的方法可以做到这一点?
这可能是一个基于观点的问题,但我真正需要的是一个基于事实的答案。

对于多处理,下面的内容应该是可行的

from multiprocessing import Process, Value
from time import sleep
import random

def producer(v):
    while True:
        sleep(10)    # working hard...
        with v.get_lock():
            v.value = random.random() * 10

def worker(v):
    while True:
        value = v.value
        if value > 5:
            print("Do something")
        else:
            print("Do something else")
        print("Do other stuff")


if __name__ == '__main__':
    v = Value('i', 7)  # See the docs for multiprocessing.Value
    producer_process = Process(target=producer, args=(v,))
    worker_process = Process(target=worker, args=(v,))
    producer_process.start()
    worker_process.start()

如果我理解正确-
script_1
运行很长时间,然后定期更新/返回一个值,并且更新该值会触发
script_2
?您希望
script_1
script_2
也在运行时返回到运行状态吗?
script_2
不需要触发,尽管它可能是一个解决方案。理想情况是按照自己的速度读取更新后的值
script_1
应该定期运行,因此是的,它应该返回运行(或者继续运行,以防它与
script_2
不交互)。这与我在多处理方面的想法非常接近。然而,似乎
工作者
在等待
q.get()
时陷入困境,这正是我想要避免的。是否有办法继续,直到设置了
q
?另外,由于我需要最后一个值,当生产者在队列中放入多个值时会发生什么?堆栈的概念在这种情况下更合适。您希望辅助进程使用相同的值继续循环,即使值没有更改?是的,完全正确。如果没有更改,也可以读取相同的值。您可以使用multiprocessing.value()在两个似乎正常工作的进程之间共享一个变量!在接受你的答案之前,我将阅读更多关于它的内容,以便给可能有贡献的其他人一些时间。谢谢:)