gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:02:30 25 4
gpt4 key购买 nike

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

### script_1 ###
from time import sleep
import random

# This could also be an infinitely running
# independent task, updating a file/database/whatever
def tedious_task():
sleep(10) # working hard...
value = random.random() * 10
return value

### script_2 ###
from script_1 import tedious_task
from time import sleep

while True:
value = tedious_task() # waiting...
if value > 5:
print("Do something")
else:
print("Do something else")

print("Do other stuff")
sleep(1)

附带说明,我不在乎记录 script_1 的更新值。我只需要最新的值(value)。

我想到了几种不同的实现方式,例如中断/回调,异步,线程,多处理,甚至在外部位置(例如文件,数据库等)上写入。只是不理想。

线程是一个潜在的候选者。我对使用线程感到很满意,但是我已经阅读了很多有关如何在未正确实现的情况下破坏系统稳定性的信息,并且我需要该系统长期稳定。我在某处读到:“尽可能使用异步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()

关于python - 从并行运行的脚本更新值的最佳方法-Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59448250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com