我有2个使用相同变量的单独脚本。
更准确地说,一种代码编辑变量,另一种代码使用变量(如果也可以编辑它们,但不是绝对必要的,那会很好。)
这是我目前正在做的事情: 当代码1编辑变量时,它将其转储到json文件中。 代码2反复打开json文件以获取变量。
此方法确实不是很优雅,而while循环确实很慢。
如何在脚本之间共享变量?
我的第一个脚本从Midi控制器获取数据并发送Web请求。 我的第二个脚本是关于LED灯条的(由于使用了相同的Midi控制器,它们得以运行)。这两个脚本都在“ while true”循环中运行。
我不能简单地将它们放在相同的脚本中,因为每个Web请求都会降低LED的速度。我目前只是通过json文件共享变量。
如果有足够的人要求它,我会发布整个代码,但是我被告知不要这样做
答案 0 :(得分:0)
考虑您提供的信息,即...
两个脚本都在“ while true”循环中运行。
我不能简单地将它们放在相同的脚本中,因为每个Web请求都会使LED变慢。
对我来说,您有2种选择:
使用客户端/服务器模型。您有2台机器。一个充当服务器,第二个充当客户端。服务器有一个带有无限循环的脚本,该脚本可以持续更新数据,而您将拥有一个API,该API可以将文件/数据库的当前状态读取并向客户端公开。客户端将在另一台计算机上,据我所知,它只会请求当前数据并进行处理。
制作一个multiprocessing
脚本。每个脚本将在单独的“线程”上运行,并管理自己的内存。由于您还希望在两个程序之间共享变量,因此可以将在两个程序之间共享的对象作为参数传递。请参见this resource
来帮助您。
请注意,对此还有更多解决方案。例如,您正在使用一个不断打开和关闭的JSON文件(这可能是程序中花费时间最多的时间)。您可以使用一个真正的数据库,该数据库只能处理一次,并且处理多次,而同时仍在更新中。
答案 1 :(得分:0)
通过Manager
from multiprocessing
,您可以很轻松地完成此类操作
首先,我将您的“ midi控制器并发送网络请求”代码简化为仅可随机睡眠一段时间并更新托管字典中的变量的内容:
from time import sleep
from random import random
def slow_fn(d):
i = 0
while True:
sleep(random() ** 2)
i += 1
d['value'] = i
接下来,我们将“ LED灯条”控件简化为仅打印到屏幕上的内容:
from time import perf_counter
def fast_fn(d):
last = perf_counter()
while True:
sleep(0.05)
value = d.get('value')
now = perf_counter()
print(f'fast {value} {(now - last) * 1000:.2f}ms')
last = now
然后您可以在单独的进程中运行这些功能:
import multiprocessing as mp
with mp.Manager() as manager:
d = manager.dict()
procs = []
for fn in [slow_fn, fast_fn]:
p = mp.Process(target=fn, args=[d])
procs.append(p)
p.start()
for p in procs:
p.join()
“快速”输出定期发生,没有明显的视觉暂停