Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 同时扭曲了许多内联回调_Python_Twisted - Fatal编程技术网

Python 同时扭曲了许多内联回调

Python 同时扭曲了许多内联回调,python,twisted,Python,Twisted,简要介绍我的情况: 我正在编写一个服务器(twisted-powered),它处理与多个客户端(超过1000个)的WebSocket连接。从服务器发送到客户端的消息在该流中通过Redis pub/subinterface进行处理(因为可以通过REST应用消息): REST将命令追加到客户端并发布 twisted因为订阅redis频道而受到攻击 消息将添加到客户端队列并等待进一步处理 现在,当客户端连接时,注册我将为每个客户端启动inlineCallback,以扫描队列,如下所示: @

简要介绍我的情况: 我正在编写一个服务器(twisted-powered),它处理与多个客户端(超过1000个)的WebSocket连接。从服务器发送到客户端的消息在该流中通过Redis pub/subinterface进行处理(因为可以通过REST应用消息):

  • REST将命令追加到客户端并发布
  • twisted因为订阅redis频道而受到攻击
  • 消息将添加到客户端队列并等待进一步处理
现在,当客户端连接时,注册我将为每个客户端启动
inlineCallback
,以扫描队列,如下所示:

    @inlineCallbacks
    def client_queue_handler(self, uuid):
        queue = self.send_queue[uuid]
        client = self.get_client(uuid)
        while True:
            uniqueID = yield queue.get()          
            client_context = self.redis_handler.get_single(uuid)
            msg_context = next(iter([msg
                                for msg in client_context
                                if msg['unique'] == unique]),
                                    None)

            client.sendMessage(msg_context)

正如我前面所说,许多客户机可能会连接。每个客户机都有自己的执行无限循环的
inlineCallback
,这是否很好?据我所知,twisted具有可定制的线程池限制。如果线程池中的客户端(inlineCallbacks)多于线程,会发生什么?将
queue.get()
阻止/休眠该“虚拟线程”,并将控制权传递给另一个?也许一个扫描所有客户端的“全局”线程是更好的选择?

inlineCallbacks
不会启动任何操作系统线程。它只是一个不同于使用
延迟
的界面。延迟的只是处理回调的API

queue.get()
返回一个
延迟的
。当您生成它时,
inlineCallbacks
在内部向它添加回调,并且您的函数保持挂起状态。当调用回调时,
inlineCallbacks
使用传递给回调的值恢复函数-这是您产生的
延迟的
的“结果”

所发生的一切就是创建了一些
延迟的
对象,并向其中添加了一些回调。在redis客户端实现的某个地方,一些事件源正在“触发”延迟的
,结果启动调用其回调的过程

您可以拥有以下任意数量: *因为您需要保存系统内存 *因为redis客户端可以一次跟踪

我不知道你的redis客户端是如何实现的。如果它必须为每个队列打开一个套接字,那么您可能会被限制为可以打开的文件描述符的数量或系统可以支持的套接字的数量。这些数字将在几万左右,当你遇到它们时,你可以使用一些技巧来进一步提高限制


如果它不必为每个队列打开一个套接字(例如,如果它可以在一个套接字上多路传输所有队列的通知),那么它可能有一个非常非常高的限制(可能是由于其实现最慢部分的算法复杂性造成的)。

感谢您的帮助和详细回答!