我正在尝试实现 fire_and_forget 功能,这是详细信息。
我正在尝试使用的异步装饰器:
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'中没有当前事件循环”并且我的事件被正确触发。