RuntimeError: Task got Future <Future pending> 附加到不同的循环

Sma*_*noj 6 python multithreading python-asyncio telethon quart

如何在Quart中的另一个异步方法内调用在主线程中获取事件循环的异步方法?

t.py

from telethon import TelegramClient, functions, types

client2 = TelegramClient(sn, api_id, api_hash).start()

async def create_contact():
    return await client2(functions.contacts.ImportContactsRequest([
        types.InputPhoneContact(0, '8', 'first_name', 'last_name')
    ]))
Run Code Online (Sandbox Code Playgroud)

应用程序

from quart import Quart, websocket,render_template,request
import t2
app = Quart(__name__)

@app.route('/wa2tg')
def wa2tg():
    return render_template('wa2tg.html',nm=request.args.get('nm',''))

@app.websocket('/wa2tg2')
async def wa2tg2():
    while True:
        data = await websocket.receive()
        await t2.create_contact()

# Thread(target=tele.client2.run_until_disconnected).start()
app.run(debug=1)        
Run Code Online (Sandbox Code Playgroud)

错误:

Running on http://127.0.0.1:5000 (CTRL + C to quit)
[2019-06-21 16:31:42,035] 127.0.0.1:51696 GET /wa2tg 1.1 200 553 12995
[2019-06-21 16:31:42,486] 127.0.0.1:51698 GET /wa2tg2 1.1 101 - 999
[2019-06-21 16:31:42,490] ERROR in app: Exception on websocket /wa2tg2
Traceback (most recent call last):
  File "C:\Users\Smart\AppData\Local\Programs\Python\Python37-32\lib\site-packages\quart\app.py", line 1629, in handle_websocket
    return await self.full_dispatch_websocket(websocket_context)
  File "C:\Users\Smart\AppData\Local\Programs\Python\Python37-32\lib\site-packages\quart\app.py", line 1651, in full_dispatch_websocket
    result = await self.handle_user_exception(error)
  File "C:\Users\Smart\AppData\Local\Programs\Python\Python37-32\lib\site-packages\quart\app.py", line 948, in handle_user_exception
    raise error
  File "C:\Users\Smart\AppData\Local\Programs\Python\Python37-32\lib\site-packages\quart\app.py", line 1649, in full_dispatch_websocket
    result = await self.dispatch_websocket(websocket_context)
  File "C:\Users\Smart\AppData\Local\Programs\Python\Python37-32\lib\site-packages\quart\app.py", line 1694, in dispatch_websocket
    return await handler(**websocket_.view_args)
  File "D:\SmartBot\my_env\SmartBot\t.py", line 13, in wa2tg2
    await t2.create_contact()
  File "D:\SmartBot\my_env\SmartBot\t2.py", line 22, in create_contact
    types.InputPhoneContact(0, '8807328487', 'first_name', 'last_name')
  File "C:\Users\Smart\AppData\Local\Programs\Python\Python37-32\lib\site-packages\telethon\client\users.py", line 60, in __call__
    result = await future
RuntimeError: Task <Task pending coro=<ASGIWebsocketConnection.handle_websocket() running at C:\Users\Smart\AppData\Local\Programs\Python\Python37-32\lib\site-packages\quart\asgi.py:135> cb=[_wait.<locals>._on_completion() at C:\Users\Smart\AppData\Local\Programs\Python\Python37-32\lib\asyncio\tasks.py:440]> got Future <Future pending> attached to a different loop
Run Code Online (Sandbox Code Playgroud)

如何将事件循环传递给夸脱?我试图获取循环并设置内部函数,但仍然出错

loop = asyncio.get_event_loop()
@app.websocket('/wa2tg2')
async def wa2tg2():
  while True:
    asyncio.set_event_loop(loop)
    data = await websocket.receive()
    await t2.create_contact()
Run Code Online (Sandbox Code Playgroud)

Sma*_*noj 1

将循环传递给后解决app.run

loop = asyncio.get_event_loop()
app.run(debug=1,loop=loop)        
Run Code Online (Sandbox Code Playgroud)

client.run_until_disconnected()由于我们将循环传递给 run 方法,因此不需要线程

有关Telethon 和 Quart的更多信息