이 질문은 내가 여기에서 물어 본 다른 사람들과 관련이있다. 주로 거대한 데이터 세트를 메모리에 정렬하는 것에 관한 것이다.Python : deferToThread XMLRPC 서버 - 뒤틀린 - Cherrypy?
트위스트 XMLRPC 서버를 실행 :
기본적으로 이것은 내가/가지고 싶은 것입니다. 이 서버는 Foo 클래스의 여러 인스턴스를 메모리에 유지합니다. 각 Foo 클래스는 목록 막대 (몇 백만 개의 레코드가 포함되어 있음)를 포함합니다. 데이터베이스에서 데이터를 검색하여 XMLRPC 서버에 전달하는 서비스가 있습니다. 데이터는 각 푸 인스턴스에 대응하는 키를, 기본적으로 사전이며, 값과 같이, 사전의 목록이다 :
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)
문제는 업데이트 기능이 기록의 많은으로 XMLRPCController에서 호출 될 때 모든 (32 개) 푸 인스턴스가 process_data 방법을 완료 할 때까지 내 GetData의 호출에 응답하지 (100K + 말)이다. deferToTread가 작동 할 것이라고 생각했지만 문제가있는 곳을 오해하고있는 것 같습니다.
제안 사항 ... 필요한 동작을 지원하는 경우 Cherrypy와 같은 다른 것을 사용하고 있습니다.
편집
@Troy :이 원자로는 지금까지 GIL로
reactor.listenTCP(port_no, server.Site(XMLRPCController)
reactor.run()
을 설정하는 방법이다이 sys.setcheckinterval을 변경할 수있는 실행 가능한 옵션이 될 것이다 () 값이 더 작아서 데이터의 잠금이 해제되어 읽을 수 있습니까?
각 Foo 인스턴스를 자체 하위 프로세스에 배치하는 것은 적어도 처음에는 시도해 볼만한 것처럼 들립니다. –