错误:根:xyz 中的错误 线程"线程-7"中没有当前事件循环



我正在尝试实现fire_and_fullet功能,下面是详细信息。

我正在尝试使用的异步装饰器:

import asyncio
import time

def fire_and_forget(f):
def wrapped(*args, **kwargs):
return asyncio.get_event_loop().run_in_executor(None, f, *args, *kwargs)
return wrapped

使用以上装饰器的异步调用:

@fire_and_forget
def call_async(self, req, body, headers_params):
logger.info("Calling ASYNC")
try:
f = urllib.request.urlopen(req)
response = f.read()
f.close()
except Exception as e:
logger.exception("api exception %s" % e)
return None
# Parse and return the response
try:
res = self._parse_response(response)
except Exception as e:
logger.exception("Exception in parsing response of %s" % e)
res = None
logger.debug("clevertap response: {}".format(res))

我的Flask应用程序调用test_xyz,它依次启动上面的火并忘记call_async:

from flask import Flask, jsonify, request
from call_xyz import test_xyz
app = Flask(__name__)
@app.route('/events_dm')
def events_dm():
session_id = request.args.get('sessionId', "11111111")
test_obj = test_xyz(session_id)
test_obj.track_test()
return jsonify({"success": True})

app.run(
host='0.0.0.0',
port=8091,
debug=True,
threaded=True
)

我不知道在哪里正确设置我的事件循环,这样我就不会得到错误:";xyz中的错误线程"thread-7"中没有当前事件循环;我的活动被正确地启动了。

Flask与异步不兼容,因此您不应该尝试在其中使用异步。

此外,您实际上并不是在使用asyncio的功能,而是调用concurrent.futuresrun_in_executor,即在后台使用线程。如果这是你需要的,你可以直接创建一个执行器,然后向它提交你的函数。例如:

import concurrent.futures
_pool = concurrent.futures.ThreadPoolExecutor()
def fire_and_forget(f):
def wrapped(*args, **kwargs):
return _pool.submit(lambda: f(*args, **kwargs))
return wrapped

您可能必须经历一次asyncio的用法及其主要核心event loop的理解。

类似的问题可能有助于你理解。

这是带有一些很好解释的教程

只需给出一些关于如何将coroutine与普通Flask应用程序一起使用的流程,这里是示例。

import asyncio
import datetime
from flask import Flask, jsonify, request

app = Flask(__name__)
def print_now():
print(datetime.datetime.now())

async def keep_printing(name: str="") -> None:
print(name, end=" ")
print_now()
await asyncio.sleep(1.50)

async def main(num_times):
result = await asyncio.gather(
keep_printing("first"),
keep_printing("second"),
keep_printing("third"),
)
return result

def execute_statement():
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(main(2))
loop.close()

@app.route('/events_dm')
def events_dm():
execute_statement()
return jsonify({"success": True})
app.run(
host='0.0.0.0',
port=8091,
debug=True,
threaded=True
)

当你点击/events_dm时输出

first 2020-07-18 00:46:26.452921
second 2020-07-18 00:46:26.452921
third 2020-07-18 00:46:26.452921
127.0.0.1 - - [18/Jul/2020 00:46:27] "GET /events_dm HTTP/1.1" 200 -

相关内容

  • 没有找到相关文章

最新更新