跨脚本共享变量

时间:2019-06-24 08:18:49

标签: python

我有2个使用相同变量的单独脚本。

更准确地说,一种代码编辑变量,另一种代码使用变量(如果也可以编辑它们,但不是绝对必要的,那会很好。)

这是我目前正在做的事情: 当代码1编辑变量时,它将其转储到json文件中。 代码2反复打开json文件以获取变量。

此方法确实不是很优雅,而while循环确实很慢。

如何在脚本之间共享变量?

我的第一个脚本从Midi控制器获取数据并发送Web请求。 我的第二个脚本是关于LED灯条的(由于使用了相同的Midi控制器,它们得以运行)。这两个脚本都在“ while true”循环中运行。

我不能简单地将它们放在相同的脚本中,因为每个Web请求都会降低LED的速度。我目前只是通过json文件共享变量。

如果有足够的人要求它,我会发布整个代码,但是我被告知不要这样做

2 个答案:

答案 0 :(得分:0)

考虑您提供的信息,即...

  

两个脚本都在“ while true”循环中运行。

     

我不能简单地将它们放在相同的脚本中,因为每个Web请求都会使LED变慢。

对我来说,您有2种选择:

  1. 使用客户端/服务器模型。您有2台机器。一个充当服务器,第二个充当客户端。服务器有一个带有无限循环的脚本,该脚本可以持续更新数据,而您将拥有一个API,该API可以将文件/数据库的当前状态读取并向客户端公开。客户端将在另一台计算机上,据我所知,它只会请求当前数据并进行处理。

  2. 制作一个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()

“快速”输出定期发生,没有明显的视觉暂停