代码之家  ›  专栏  ›  技术社区  ›  sberry

Python:defertoThreadXMLRPC服务器-Twisted-Cherrypy?

  •  -1
  • sberry  · 技术社区  · 15 年前

    这个问题与我在这里提出的其他问题有关,主要是关于在内存中对大量数据集进行排序。

    基本上这就是我想要/拥有的:

    Twisted XMLRPC服务器正在运行。此服务器在内存中保留若干(32)个Foo类实例。每个Foo类都包含一个列表栏(其中将包含数百万条记录)。有一个从数据库检索数据并将其传递给XMLRPC服务器的服务。数据基本上是一个字典,每个Foo实例对应键,值是字典列表,如下所示:

    data = {'foo1':[{'k1':'v1', 'k2':'v2'}, {'k1':'v1', 'k2':'v2'}], 'foo2':...}
    

    class XMLRPCController(xmlrpc.XMLRPC):
    
        def __init__(self):
            ...
            self.foos = {'foo1':Foo(), 'foo2':Foo(), 'foo3':Foo()}
            ...
    
        def update(self, data):
            for k, v in data:
                threads.deferToThread(self.foos[k].processData, v)
    
        def getData(self, fookey):
            # return first 10 records of specified Foo.bar
            return self.foos[fookey].bar[0:10]
    
    class Foo():
    
        def __init__(self):
            bar = []
    
        def processData(self, new_bar_data):
            for record in new_bar_data:
                # do processing, and add record, then sort
                # BUNCH OF PROCESSING CODE
                self.bar.sort(reverse=True)
    

    问题是,当使用大量记录(比如100K+)在XMLRPCController中调用update函数时,它会停止响应我的getData调用,直到所有32个Foo实例都完成了process_data方法。我原以为延迟线程可以工作,但我想我误解了问题所在。

    任何建议。。。如果Cherrypy支持这种必需的行为,我愿意使用其他东西,比如Cherrypy。


    编辑

    reactor.listenTCP(port_no, server.Site(XMLRPCController)
    reactor.run()
    

    就吉尔而言,这是一个可行的改变选择吗 sys.setcheckinterval()

    2 回复  |  直到 15 年前
        1
  •  1
  •   mthurlin    15 年前

    让应用程序响应的最简单方法是将CPU密集型处理分解成更小的块,同时让扭曲的反应器在其间运行。例如,通过调用reactor.callLater(0,process\u next\u chunk)前进到下一个chunk。自己有效地执行多任务协作。

    另一种方法是使用单独的进程来完成工作,然后您将受益于多个核心。看看安瓿: https://launchpad.net/ampoule

        2
  •  0
  •   Troy J. Farrell    15 年前

    我不知道processData方法运行了多长时间,也不知道如何设置Twistedreactor。 By default

    您还需要询问GIL在更新所有这些集合中扮演的角色。

    编辑: 在您对程序进行任何重大更改之前(如呼叫 sys.setcheckinterval()