help pls, when func A and func B are in defference Sanic-Server, same global asyncio.Event() var in them cant sync
ShelbyCheng opened this issue · comments
Is there an existing issue for this?
- I have searched the existing issues
Describe the bug
when func A and func B are in different Sanic-Server, same global asyncio.Event() var in them cant sync
Code snippet
generate_event = asyncio.Event()
generate_event.clear()
async def gg(req: request):
debug_logger.info('gg func start')
global generate_event
generate_event.clear()
async def generate_answer1(response):
i = 0
while i < 1000:
i += 1
response_str = "delta_answer"
response_status = "running"
debug_logger.info('gg func {} 1'.format(response_status))
stream_res = {
"code": 200,
"msg": str(i),
"question": "",
"response": response_str,
"history": [],
"source_documents": [],
}
debug_logger.info('gg func {} 2'.format(response_status))
await response.write(f"data: {json.dumps(stream_res, ensure_ascii=False)}\n\n")
debug_logger.info('gg func {} 3'.format(response_status))
await asyncio.sleep(0.001)
if generate_event.is_set():
response_str = "final"
response_status = "stop"
debug_logger.info('gg func {} 1'.format(response_status))
stream_res = {
"code": 200,
"msg": str(i),
"question": "",
"response": response_str,
"history": [],
"source_documents": [],
}
debug_logger.info('gg func {} 2'.format(response_status))
await response.write(f"data: {json.dumps(stream_res, ensure_ascii=False)}\n\n")
debug_logger.info('gg func {} 3'.format(response_status))
await response.eof()
debug_logger.info('gg func {} 4'.format(response_status))
response_stream = ResponseStream(generate_answer1, content_type='text/event-stream')
return response_stream
async def change_generate(req: request):
global generate_event
generate = safe_get(req, 'generate', True)
debug_logger.info('generate status change')
if not generate:
generate_event.set()
if generate_event.is_set():
debug_logger.info('generate_event is set')
debug_logger.info('generate became False')
else:
debug_logger.info('generate is True')
generate_event.clear()
return sanic_json({"code": 200, "msg": "generate status {}".format(generate)})
Expected Behavior
test function below does not work as expected, sometimes it works, and sometimes it does not.
def stream_requests(data_raw, func_name):
url = 'http://192.168.13.216:8777/api/local_doc_qa/{}'.format(func_name)
response = requests.post(
url,
json=data_raw,
timeout=60,
stream=True
)
for line in response.iter_lines(decode_unicode=False, delimiter=b"\n\n"):
if line:
yield line
def test():
data_raw = {
}
data_raw1 = {
"generate": False,
}
url = "http://192.168.13.216:8777/api/local_doc_qa/change_generate"
headers = {
"Content-Type": "application/json"
}
for i, chunk in enumerate(stream_requests(data_raw, "gg")):
if chunk:
chunkstr = chunk.decode("utf-8")[6:]
chunkjs = json.loads(chunkstr)
print(chunkjs)
if i == 5:
print('try to stop')
response = requests.post(url, headers=headers, data=json.dumps(data_raw1))
print(response.text)
print('did get through')
if name == 'main':
test()
logs like the below:
How do you run Sanic?
As a script (app.run
or Sanic.serve
)
Operating System
Linux
Sanic Version
23.12.1
Additional context
No response
It is really hard to read this code, and it doesn't look like there's anything Sanic specific there. By your own admission it works sometime and not others which points to a race condition in your code and it doesn't sound like anything related to Sanic.
Furthermore, this is a support question, not a bug. Please see our help section for ways in which we can offer support: https://sanic.dev/en/help.html.