asyncio 问题 - 我无法同时运行两个进程

问题描述 投票:0回答:1

我正在尝试使用 asyncio。

我想计算读取arduino串口的时间。我使用硬件触发器向外部发送 arduino 串口。

我的代码是:

import asyncio
from Classes.Arduino_class import ArduinoController


async def wait_for_serial(ard):
    print('entered function')
    data = await ard.read_data()
    return data


async def main():
    ard = ArduinoController()
    task = asyncio.create_task(wait_for_serial(ard))
    ind = 0
    while True:
        print(ind)
        ind += 1
        if task.done():
            result = await task
            print(f"Got signal from Arduino: {result}")
            break
        else:
            await asyncio.sleep(1)


if __name__ == '__main__':
    asyncio.run(main())

Arduino 类是:

class ArduinoController:
    def __init__(self):
        self.ard = serial.Serial('COM7', 2000000)
        time.sleep(0.2)

    async def read_data(self):
        return self.ard.read().decode()

    def write_data(self, val):
        self.ard.write(val.encode())

ard.read() 命令是一个阻塞代码直到读取数据的命令。

我为这个简单的脚本尝试了几种配置,但我就是找不到正确的配置。 通常发生的情况是脚本打印“0”,然后“输入函数”,然后停止,直到我发送 arduino 序列号。

asynchronous arduino python-asyncio
1个回答
0
投票

由于

self.ard.read()
是阻塞的,因此您需要修改
read_data
方法,以便它可以以某种方式启动并等待读取调用完成,而不会阻塞其他异步任务:

from concurrent.futures import ThreadPoolExecutor
...

NUM_CONCURRENT_READ_WRITE_REQUESTS = 1  # Size of the thread pool
executor = ThreadPoolExecutor(NUM_CONCURRENT_READ_WRITE_REQUESTS)

...

class class ArduinoController:
    ...

    async def read_data(self):
        loop = asyncio.get_running_loop()
        data = await loop.run_in_executor(executor, self.ard.read)
        return data.decode()

    ...
© www.soinside.com 2019 - 2024. All rights reserved.