sanic-org / sanic

Accelerate your web app development | Build fast. Run fast.

Home Page:https://sanic.dev

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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:

a case that works:
1711942662382

a case that does not work:
1711942723286

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.