进程与线程之间的通信

时间:2019-10-22 19:09:46

标签: python-3.x multithreading multiprocessing uvicorn

我是一个音乐团体的成员,其主要元素之一是弯针。但是,这个(rc300老板)有一些错误。我们有一个非常特殊的用途,尝试了其他踏板之后,我们找不到真正适合的踏板(midi同步问题,不适合我们的循环启动行为)。

所以我开始用python编写一个小的原型,虽然我知道这不是最快的语言,但是我是最了解的一种语言,所以对于原型设计,我认为这很好,而且它有许多文档齐全的库可供操作声音,midi信号等。我得到了一些基本但最终的结果,一个多轨和多回路循环器,工作时没有太多延迟。

我现在想创建一个允许用户远程控制某些参数或仅查看信息的界面。我受到数字调音台当前正在做的事情的启发,可以通过平板电脑通过网络浏览器对其进行控制。显然,这将不会用于启动录制或回放会话,这些事件可以通过Midi踏板控制。

因此,我想设置一个Websocket服务器,允许我操纵程序数据。那就是它变得复杂的地方。

对于该示例,我已将程序减少到最少。设定速度的时钟。可以通过websocket操纵的速度如下图所示: diagram

我将uvicorn放入一个进程中,因为它的执行被阻止了。但是,我一般都没有python或开发方面的高级技能,因此我不得不处理变量共享的问题。

总结一下: 1 /我有一个类/线程Clock -它针对名为TEMPO的变量创建音频点击。 -此类具有rise_tempo()reduce_tempo()方法,当从main()调用时,它们可以很好地工作。

2 /我有一个运行uvicorn的run_server进程。 -它打开了一个网络套接字,并接收或发送信息。

我在主循环中实例化时钟(clock=Clock())和run_server

但是,当我从clock进程调用run_server对象方法时,它们不起作用。我猜这是因为clock对象在流程中未共享。

所有示例代码都在以下gitlab存储库中:https://gitlab.com/emmanuel.kormann/clock_example

这里有一些摘录:


TEMPO = 60

class Clock(Thread):
    [...]

    def rise_tempo(self):
        global TEMPO
        TEMPO = TEMPO + 10
        self.build_sample()

    def reduce_tempo(self):
        global TEMPO
        TEMPO = TEMPO - 10
        self.build_sample()

    def run(self):
        [...]

clock = Clock()

app = FastAPI()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()

    while True:
        data = await websocket.receive_text()
        if data == '+':
            clock.rise_tempo()
        await websocket.send_text(f"Message text was: {TEMPO}")


def run_server():
    uvicorn.run(app, host='127.0.0.1', port=8000)


def main():
    proc = Process(target=run_server, args=(), daemon=True)
    proc.start()
    clock.start()

我应该采用哪种架构来实现自己的目标?

0 个答案:

没有答案
相关问题