【发布时间】:2018-06-16 19:11:17
【问题描述】:
我似乎很难理解 pythons asyncio。我没有编写任何代码,因为我看到的所有示例都是一次性运行的。创建一些协程,将它们添加到事件循环中,然后运行循环,它们运行在它们之间切换的任务,完成。这对我来说似乎没什么帮助。
我想使用 asyncio 来不中断我的应用程序中的操作(使用 pyqt5)。我想创建一些函数,当它们被调用时在 asyncio 事件循环中运行,然后当它们完成时它们会执行回调。
我想象的是。为 asyncio 创建一个单独的线程,创建循环并永远运行它。创建一些函数getFile(url, fp),get(url),readFile(file)等。然后在UI中,我有一个带有提交按钮的文本框,用户输入url,点击提交,它下载文件。
但是,我看到的每个示例,我都看不到如何将协程添加到正在运行的循环中。而且我不知道如何在不添加运行循环的情况下做我想做的事。
#!/bin/python3
import asyncio
import aiohttp
import threading
loop = asyncio.get_event_loop()
def async_in_thread(loop):
asyncio.set_event_loop(loop)
loop.run_forever()
async def _get(url, callback):
print("get: " + url)
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
result = await response.text()
callback(result)
return
def get(url, callback):
asyncio.ensure_future(_get(url, callback))
thread = threading.Thread(target=async_in_thread, args=(loop, ))
thread.start()
def stop():
loop.close()
def callme(data):
print(data)
stop()
get("http://google.com", callme)
thread.join()
这是我想象的,但它不起作用。
【问题讨论】:
-
asyncio.ensure_future()会这样做。 -
@MartijnPieters OP 想要从不同的线程添加协程,
ensure_future并非设计为这样做的。 -
@user4815162342:很公平。我专注于“如何给异步事件循环一个新任务”部分。
标签: python python-asyncio