对于一个游戏网站,我想要一个玩家竞争,要么是一个人或一个人工智能。我正在使用Django +通道(Django-4.0.2 asgiref-3.5.0 Channels 3.0.4)这是一段漫长的学习过程.
Human :游戏的进行是由浏览器轮流进行的。每次播放器连接时,都会打开一个websocket连接,移动通过套接字发送,由使用者处理(验证并保存在数据库中)并发送给另一个播放器。它仅通过同步编程来管理。
Human :我尝试使用与以前相同的路径。测试分支检查游戏是否针对计算机,并处理移动,而不是从websocket的另一端接收。这个AI移动可以是一个阻塞操作,因为它可以从2秒到5秒。我不希望消费者的接收方法等待AI返回其移动,因为我还有其他操作要快速完成(比如更新客户端的一些信息)。然后,我想我可以很容易地利用据称已经存在的通道框架事件循环。我可以将AI思维过程发送到这个循环,然后通过使用者的发送方法将结果返回给客户端。然而,当我写到:
loop = asyncio.get_event_loop()
loop.create_task(my_AI_thinking())Django引发一个运行时工作错误(与这里描述的相同:https://github.com/django/asgiref/issues/278),告诉我没有正在运行的事件循环。解决方案似乎是将asgiref升级到3.5.0,但问题没有解决。
我想我有点缺乏背景,一些启示应该能帮助我更好地理解这次失败的根本原因。我的第一个问题是:
组合框中的
也许你的答案会引起其他问题。
发布于 2022-02-28 11:30:51
您试过在Django 3.2上运行event_loop示例吗?(和/或使用不同的Python版本)?我在Django 4.0和Python3.10中遇到了各种问题,所以我继续使用Django 3.2和Python3.7/3.8/3.9,也许您的错误就是这些问题之一?
如果您无法运行event_loop,我将看到两种可能的替代解决方案:
multiprocessing“手动”发送计算AI移动到其他线程,然后在收到结果(移动)后再次加入两个线程。老实说,Python中的多处理非常简单--如果您熟悉多线程应用程序的想法,这是非常方便的。不幸的是,我自己还没有在频道中使用事件循环,也许在这个问题上更有经验的人能够更好地解决你的问题。
https://stackoverflow.com/questions/71145039
复制相似问题