跨脚本共享变量

2024-05-19 12:04:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个单独的脚本使用相同的变量。你知道吗

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

这就是我目前正在做的: 当代码1编辑一个变量时,它会将其转储到一个json文件中。 代码2重复打开json文件以获取变量。你知道吗

这种方法确实不优雅,while循环非常慢。你知道吗

如何跨脚本共享变量?你知道吗

我的第一个脚本从midi控制器获取数据并发送web请求。 我的第二个脚本是用于LED条带(那些运行感谢同一个midi控制器)。两个脚本都以“while true”循环运行。你知道吗

我不能简单地将它们放在同一个脚本中,因为每个webrequest都会减慢led的速度。我目前只是通过一个json文件共享变量。你知道吗

如果有足够多的人要求,我会张贴整个代码,但我已经被告知不要这样做


Tags: 文件方法代码脚本webjsontrue编辑
2条回答

考虑到你提供的信息,意思是。。。你知道吗

Both script run in a "while true" loop.

I can't simply put them in the same script since every webrequest would slow the LEDs down.

对我来说,你有两个选择:

  1. 使用客户机/服务器模型。你有两台机器。一个充当服务器,另一个充当客户端。服务器有一个带有无限循环的脚本,可以一致地更新数据,而您将有一个API,可以读取文件/数据库的当前状态并将其公开给客户端。客户机将在另一台机器上,据我所知,它只需请求当前数据,并对其进行处理。

  2. 制作一个^{}脚本。每个脚本将在一个单独的“线程”上运行,并管理自己的内存。由于您还希望在两个程序之间共享变量,因此可以将一个将在两个程序之间共享的对象作为参数传递。请参阅^{}以帮助您。

请注意,有更多的解决方案。例如,您使用的是一个JSON文件,您一直在打开和关闭它(这可能是程序中花费时间最多的部分)。您可以使用一个真正的数据库,它可以处理只打开一次,处理多次,同时仍在更新。你知道吗

使用^{} from ^{}可以很容易地完成这类工作

首先,我将您的“midi控制器和发送web请求”代码简化为只会随机休眠一段时间并更新托管字典中的变量的代码:

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()

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

相关问题 更多 >

    热门问题