Reputation: 1
I want to stop running the generating function immediately, whenever stop_requested in the websocket.
class ImageGeneration(BaseAIGeneration):
async def process(self, websocket, prompt):
if websocket.stop_requested:
return None
await super().process(websocket, prompt)
if websocket.stop_requested:
return None
response = await self.generate_image(prompt=prompt, model=self.model, size=size)
if websocket_instance.stop_requested or not response:
return None
if response and isinstance(response, list):
image_url = response[0].url
return image_url
And generate_image function currently is function
async def generate_image(
prompt: str,
model: str,
size: str = "1024x1024"
):
response = await client.images.generate(
model=model,
prompt=prompt,
size=size,
n=1
)
return response.data
Currently it waits until generate_image fully runs, and only then stops.
I was thinking of creating a task, that will gonna check if the response:
while not task.done():
if websocket_instance.stop_requested:
task.cancel()
await asyncio.sleep(0.1)
But for me this solution looks weird, and I do not think it is the correct way, how to make the function stop immediately, when in websocket stop requested?
Upvotes: -1
Views: 36
Reputation: 15728
You can use synchronization primivites (especially the Event
or Condition
instead of that while-loop:
stop_ev = asyncio.Event()
await stop_ev.wait()
task.cancel()
# whenever you stop the websocket:
websocket.stop_requested = True
stop_ev.set()
If you want a lower level alternative you can use futures:
loop = asyncio.get_running_loop()
fut = loop.create_future()
await fut
task.cancel()
# whenever you stop the websocket:
websocket.stop_requested = True
fut.set_result(None)
Upvotes: 0