不确定是否可以实现。我想从脚本中触发HTTP POST请求,但不等待响应。相反,我想立即返回。
我尝试以下方法:
#!/usr/bin/env python3
import asyncio
import aiohttp
async def fire():
await client.post('http://httpresponder.com/xyz')
async def main():
asyncio.ensure_future(fire())
if __name__ == '__main__':
loop = asyncio.get_event_loop()
client = aiohttp.ClientSession(loop=loop)
loop.run_until_complete(main())
脚本立即返回而没有错误,但是HTTP请求永远不会到达目的地。我可以触发POST请求,但不等待服务器的响应,仅在发送请求后立即终止?
答案 0 :(得分:1)
使用asyncio
可以将简单的装饰器编写为@background
。现在,您可以在foo()
中编写任何内容,而控制流将不等待其完成。
import asyncio
import time
def background(f):
from functools import wraps
@wraps(f)
def wrapped(*args, **kwargs):
loop = asyncio.get_event_loop()
if callable(f):
return loop.run_in_executor(None, f, *args, **kwargs)
else:
raise TypeError('Task must be a callable')
return wrapped
@background
def foo():
time.sleep(1)
print("foo() completed")
print("Hello")
foo()
print("I didn't wait for foo()")
生产
>>> Hello
>>> I didn't wait for foo()
>>> foo() completed
答案 1 :(得分:0)
我have answered的问题很相似。
async def main():
asyncio.ensure_future(fire())
ensure_future
schedules coro execution,但不等待其完成,run_until_complete
不等待所有期货的完成。
这应该解决它:
async def main():
await fire()