flask + asyncio 应用程序可以在 Windows 上运行,但不能在 Linux 上运行? (“Future <Future pending> 附加到不同的循环”错误)

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

我有一个 python 脚本,它创建一个 Flask 应用程序,其路由使用 asyncio (通过蓝牙进行通信,使用 bleak)。该脚本在 Windows 上运行良好,但是当从树莓派(具有相同的 python、flask 和 asyncio 版本)运行时,通过 Flask 应用程序调用异步函数会出现错误:

"RuntimeError: Task [...] got Future <Future pending> attached to a different loop"

我对 Flask 和 asyncio 都很陌生,但我认为这意味着 Flask 路由正在新线程中调用该函数,而我需要以某种方式向已经运行的线程添加一个任务。但是不同操作系统上的行为有所不同是否有原因?

如果我用 ctrl-C 中断脚本,导致错误的函数似乎已成功完成。

Python 3.9、带异步功能的 Flask 2.0.2

剧本:

from flask import Flask, render_template, request, redirect
import asyncio
from bleak import BleakClient, BleakScanner

IO_UUID = "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"

COMMANDS = {
    "power" : bytes.fromhex("1F30 4145 09")
}

async def discover():
    while True:
        devices = await BleakScanner.discover()
        for d in devices:
            if d.name:
                print(d.name)
                if "GxTimer_" in d.name:
                    print("Timer Found")
                    return d.address

async def main():
    address = await discover()
    while True:
        try:
            async with BleakClient(address) as client:
                await client.pair()

                app = Flask(__name__)

                @app.route('/')
                def index():
                    return render_template('index.html')

                @app.route('/power', methods=['POST'])
                async def power():
                    await client.write_gatt_char(IO_UUID, COMMANDS['power'])
                    return redirect('/')

                if __name__ == '__main__':
                    app.run(debug=False, host='0.0.0.0')

        except Exception as e:
            print(e)


asyncio.run(main())
python flask asynchronous python-asyncio
1个回答
0
投票

我正在尝试连接到我的飞利浦 Hue 灯

我也有同样的错误:

await ble_client.write_gatt_char(LIGHT_CHARACTERISTIC, b"\x01", response=False)

运行时错误:任务init.py:776>>得到 未来附加到不同的循环

我尝试将我的代码放在两个不同的文件中

我还创建了 2 个线程,一个用于 Flask 应用程序,一个用于连接到我的蓝牙设备以保持连接 这不是一个好主意,但是已经有很多绝望的尝试了

def flask_thread():
    app.run(host='192.168.0.11')

def connect_thread():
    s = 0
    while True:
        print("Check if connected in "+str(s))
        time.sleep(s)
        asyncio.run(connect())
        s = s*4+30

if __name__ == "__main__":
    asyncio_thread = Thread(target=connect_thread)
    flask_thread = Thread(target=flask_thread)

    asyncio_thread.start()
    flask_thread.start()
    asyncio_thread.join()

但是,我在连接后很短的时间内(0.5秒)成功连接并向我的灯发送了信号 当我几秒钟后再次尝试时,我不能并且错误返回

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