草庐IT

python - 在 Twisted 和 Django 之间共享数据库

coder 2023-08-19 原文

我正在开发一个多人游戏服务器,它使用 Django 作为网络服务器(HTML 前端、用户身份验证、可用游戏、排行榜等)和 Twisted 来处理玩家和游戏之间的连接以及与游戏本身的交互。游戏服务器、网络服务器和数据库可能运行在不同的机器上。

构建共享数据库的“最佳”方式是什么,以一种支持对数据库模式进行更改的方式。我是否应该尝试将 Django 的 ORM 合并到 Twisted 框架中并使用 deferreds 使其成为非阻塞的?我是否应该坚持创建和维护两个独立的数据库模式/接口(interface),一个在 Django 的模型中,另一个使用 twisted.enterprise.row?

同样,对于用户身份验证,我应该利用 twisted 的用户身份验证功能,还是尝试将 Django 模块包含到游戏服务器中以在游戏端处理用户身份验证?

最佳答案

首先,我要确定为什么您需要 Django 和 Twisted。假设您熟悉使用 twisted.web 和 auth 的 Twisted 就足够了,您将能够为前端和后端应用重用数据库层。

或者您可以换个角度来看,作为游戏服务器,Twisted 在哪些方面做得更好?您是希望支持更多玩家(更多同时连接)还是其他?考虑一下,如果您必须在扭曲中使用线程来阻止数据库访问,那么您很可能无法有效/可靠地支持数百个并发线程。请记住 python 有一个全局解释器锁,因此线程不一定是扩展的最佳方式。

您还应该考虑为什么要使用 SQL 数据库和 ORM。您的游戏是否有真正最适合存储在关系数据库中的数据?也许值得研究一下用于存储游戏状态的 MongoDB 或其他键值或对象数据库。这些 NoSQL 存储中的许多都有用于 Django 的阻塞驱动程序和用于 Twisted(例如 txmongo)的非阻塞驱动程序。

也就是说,如果您执意要同时使用 Django 和 Twisted,可以使用一些技术将阻塞式数据库访问嵌入到非阻塞式 Twisted 服务器中。

  1. adbapi(使用扭曲线程池)
  2. 使用reactor.deferToThread直接使用twisted线程池
  3. Storm ORM 有一个分支提供 Twisted 支持(它在内部处理 deferToThread 调用)
  4. SAsync 是一个试图让 SQLAlchemy 以异步方式工作的库
  5. 通过 RPC 与管理阻塞数据库的进程进行扭曲交互

因此,您应该能够自己管理 Django ORM 对象,方法是在扭曲中导入它们并非常小心地调用 reactor.deferToThread。在 twisted 中处理这些对象时可能会出现许多问题,因为某些 ORM 对象在访问/设置属性等时可能会发出 SQL。

我知道这不一定是您期望的答案,但也许更多关于您希望完成的事情以及您选择这些特定技术的原因的详细信息将使人们能够为您提供更好的答案。

关于python - 在 Twisted 和 Django 之间共享数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5051408/

有关python - 在 Twisted 和 Django 之间共享数据库的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  4. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  5. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  6. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  7. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  8. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  9. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  10. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

随机推荐