我想寫一些asyncio代碼,持有多個用戶/連接的會話狀態。保持會話狀態與發電機,而不是FSM在asyncio
這裏是一個小玩具例子:
Please tell me your name:
asd
how old are you?
40
asd is 40 years old
我想實現這一點的最好的辦法是像發生器功能:
class MessageReciever():
async def start_conversation(user_id):
await send_message(user_id, "Please tell me your name")
name = await wait_for_reply(user_id)
await send_message(user_id, "how old are you?")
age = await wait_for_reply(user_id)
await send_message(user_id, "{} is {} years old".format(name, age)
目前,我只有一個功能async on_message(user_id, message)
是獲得每次收到消息時都會調用它。對於我現在擁有無國籍的所有東西來說,這很好。
這個理想的做法提出了許多問題:
- 我不知道如何等待()是由我自己的代碼觸發的事件。
- 如果時間過長,我不知道如何超時。我不想將會話永久保存在RAM中,似乎並沒有簡單的方法來結束正在運行的協程或將其清除到數據庫。
解決此問題的典型方法是編寫FSM,並將每個用戶的狀態保存在單獨的結構中,但編寫和調試大型FSM非常煩人,尤其是在原型設計時。我在FSM中也不需要任何循環。
我該如何實現一種簡單的方法來保持asyncio中有狀態的「對話」?
你對這個問題的答案仍然感興趣嗎? – Omnifarious
當然,我現在寫了一些非常難看的代碼。 – Atsch