我有一个 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())
我正在尝试连接到我的飞利浦 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秒)成功连接并向我的灯发送了信号 当我几秒钟后再次尝试时,我不能并且错误返回