【问题标题】:How to concurrently run several continuous tasks in a Python Twisted server using threading?如何使用线程在 Python Twisted 服务器中同时运行多个连续任务?
【发布时间】:2014-03-30 04:18:00
【问题描述】:

假设您有 1000 个客户端连接到一个扭曲的服务器。这些客户端不断地轮询更新(或者只是通过WebSocket 之类的东西持续连接)。服务器的工作是遍历所有 1000 个,检查其中哪些有更新,然后在更新时将其发送出去。

有没有办法做到,在 Twisted 中,我可以在 4 个线程中运行 250 个(或者进一步划分它)? Twisted 如何决定一次运行多少个任务?我可以连续检查250,甚至不时更改分布吗?

这是我想象的一个非常简单的版本,虽然我不知道它在 Twisted 中的样子:

class Server:

    queues = [["250 clients"], ["250 clients"], ["250 clients"], ["250 clients"]]

    @classmethod
    def run_server(cls):
        for i in xrange(len(cls.queues)):
            # this would run in its own thread
            cls.continuously_check_for_updates(cls.queues[i])

        # server mainloop
        while True:
            if get_client_connection():
                store_client_in_queue()
                distribute_client_queues()

    @classmethod
    def continuously_check_for_updates(cls, queue):
        i = 0
        while True:
            if i >= len(queue):
                i = 0

            client = queue[i]
            if check_for_updates(client):
                report_update(client)

            i += 1
    

感谢您的洞察力和建议。谢谢。

【问题讨论】:

    标签: python multithreading websocket twisted


    【解决方案1】:

    没有。 Python 一次只会执行一个线程(忽略一些不相关的细节)。没有理由使用线程来解决这个问题。

    相反,您应该使用一种您没有的事件驱动方法来不断检查一千种不同的数据结构。而是在发生相关变化时采取行动。

    例如,不要写这样的程序:

    def addSomeData(data):
        someList.append(data)
    
    def checkForData():
        if someList:
            return someList.pop(0)
        return None
    
    while True:
        data = checkForData()
        if data is not None:
            processData(data)
    

    改为编写这样的程序:

    def addSomeData(data):
        processData(data)
    

    它更简单、更高效。

    【讨论】:

    • 嗯,我想使用线程的原因是因为所有的检查都需要大量的 I/O,这是一个阻塞操作。如果其中一个线程被阻塞,其他线程仍然可以继续检查,直到一切都被释放。
    • 其实现在想想,既然4个线程都使用同一个源,会不会互相冲突/阻塞?源是 MySQL 数据库。
    • I/O 不是阻塞操作。在没有阻塞的情况下进行 I/O 是 Twisted 的中心思想。另见twistedmatrix.com/documents/current/core/howto/rdbms.htmlgithub.com/hybridlogic/txMySQL
    猜你喜欢
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2023-02-06
    相关资源
    最近更新 更多