首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django通道和运行事件循环

django通道和运行事件循环
EN

Stack Overflow用户
提问于 2022-02-16 15:52:58
回答 1查看 464关注 0票数 1

对于一个游戏网站,我想要一个玩家竞争,要么是一个人或一个人工智能。我正在使用Django +通道(Django-4.0.2 asgiref-3.5.0 Channels 3.0.4)这是一段漫长的学习过程.

Human :游戏的进行是由浏览器轮流进行的。每次播放器连接时,都会打开一个websocket连接,移动通过套接字发送,由使用者处理(验证并保存在数据库中)并发送给另一个播放器。它仅通过同步编程来管理。

Human :我尝试使用与以前相同的路径。测试分支检查游戏是否针对计算机,并处理移动,而不是从websocket的另一端接收。这个AI移动可以是一个阻塞操作,因为它可以从2秒到5秒。我不希望消费者的接收方法等待AI返回其移动,因为我还有其他操作要快速完成(比如更新客户端的一些信息)。然后,我想我可以很容易地利用据称已经存在的通道框架事件循环。我可以将AI思维过程发送到这个循环,然后通过使用者的发送方法将结果返回给客户端。然而,当我写到:

代码语言:javascript
复制
loop = asyncio.get_event_loop()  
loop.create_task(my_AI_thinking())

Django引发一个运行时工作错误(与这里描述的相同:https://github.com/django/asgiref/issues/278),告诉我没有正在运行的事件循环。解决方案似乎是将asgiref升级到3.5.0,但问题没有解决。

我想我有点缺乏背景,一些启示应该能帮助我更好地理解这次失败的根本原因。我的第一个问题是:

组合框中的

  1. +通道+ asgi:哪个负责运行事件循环?
  2. 如何检查是否确实有一个事件循环在运行线程?

也许你的答案会引起其他问题。

EN

回答 1

Stack Overflow用户

发布于 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,我将看到两种可能的替代解决方案:

  1. 打开两个WS连接:一个仅用于移动,另一个用于所有其他内容,例如更新玩家UI信息等。
  2. 还可以使用multiprocessing“手动”发送计算AI移动到其他线程,然后在收到结果(移动)后再次加入两个线程。老实说,Python中的多处理非常简单--如果您熟悉多线程应用程序的想法,这是非常方便的。

不幸的是,我自己还没有在频道中使用事件循环,也许在这个问题上更有经验的人能够更好地解决你的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71145039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档