2014-01-13 7 views
3

파이썬을 사용하여 알고리즘 거래 플랫폼을 구축 중입니다. 여러 알고리즘이 시장을 모니터링하고 매일 09:30에서 16:00 사이에 거래를 실행합니다.파이썬 다중 처리 : 서버에서 프로세스 시작/중지

내가 찾고있는 것은 임의로 알고리즘을 시작하고 중지하는 것입니다. 따라서 multiprocessing을 사용하여 서버 스크립트를 실행하고 주어진 시간에 알고리즘을 시작/중지/나열 할 수 있습니다 (별도로 process에서 실행해야 함).

어떻게 수행 할 수 있습니까? 대부분의 온라인 예제는 내 문제에 맞지 않는 큐 서버를위한 것입니다.

편집 :

내가 패키지 multiprocessing와이에 노력하고 있어요. 대기열을 사용하는 아이디어는 나에게 잘못된 것 같습니다. 임의의 수의 프로세스가 하루 종일 또는 적어도 중지 할 때까지 사실 실행을위한 것이라는 것을 알고 있습니다. 짧은 스크립트를 실행하고 이전 작업이 완료되면 작업자가 대기열에서 다음 작업을 소비하도록하지는 않습니다. 사실 나는 Manager을 사용하는 서버 스크립트를 가지고 영원히 돌아가고 요청할 때 별도의 프로세스/스레드에서 새로운 스크립트를 시작하는 것을 생각하고 있습니다. 그러나 나는 그것을 멈추게하는 과정에 정지 신호를 보낼 수 있기를 원합니다. 내가 좀 뒤로 내가 가진 무엇 :-)이되어하고있어 느낌이 수행

server.py :

import multiprocessing as mp 
from multiprocessing import Process 
from multiprocessing.managers import BaseManager 
from time import strftime 


class Server(object): 
    def __init__(self, port=50000, authkey=''): 
     self.processes = {} 
     self._authkey = authkey 
     self.port = port 
     self.server = None 
     self.running = False 
     BaseManager.register('get_process', callable=lambda: self) 


    def start_server(self): 
     manager = BaseManager(address=('', self.port), authkey=self._authkey) 
     self.server = manager.get_server() 
     try: 
      self._logmessage("Server started") 
      self.running = True 
      self.server.serve_forever() 
     except (KeyboardInterrupt, SystemExit): 
      self.shutdown() 

    def start_process(self, mod, fcn, *args, **kwargs): 
     mod = __import__(mod, globals(), locals(), ['object'], -1) 
     key = "{0}.{1}".format(mod, fcn) 
     assert not key in self.processes, \ 
      "Process named '%s' already exists" % key 
     p = Process(target=getattr(mod, fcn), name=mod, args=(None,), kwargs=kwargs) 
     self._logmessage("Process '%s' started" % key) 
     p.start() 
     # p.join() 
     self.processes[key] = p 

    def stop_process(self, key): 
     self.processes[key].terminate() 
     del self.processes[key] 

    def get_processes(self): 
     return self.processes.keys() 

    def shutdown(self): 
     for child in mp.active_children(): 
      child.terminate() 
     self.server.shutdown() 
     self.running = False 
     print "Shutting down" 

    def _logmessage(self, msg): 
     print "%s: %s" % (strftime('%Y-%m-%d %H:%M:%S'), msg) 


if __name__ == '__main__': 
    server = Server(authkey='abc') 
    try: 
     server.start_server() 
    except (KeyboardInterrupt, SystemExit): 
     server.shutdown() 

client.py :

from multiprocessing.managers import BaseManager 
import time 


class Client(object): 
    def __init__(self, host='', port=50000, authkey=''): 
     self.host = host 
     self.port = port 
     self.manager = None 
     self.process = None 
     self._type_id = 'get_process' 
     self._authkey = authkey 
     self.manager = BaseManager(address=(self.host, self.port), authkey=self._authkey) 
     BaseManager.register(self._type_id) 

    def connect(self): 
     try: 
      self.manager.connect() 
      self._logmessage("Connected to server") 
     except: 
      self._logmessage("Could not connect to server") 
     self.process = getattr(self.manager, self._type_id)() 

    def start_process(self, mod, fcn): 
     self.process.start_process(mod, fcn) 
     self._logmessage("Process '%s' started" % fcn) 

    def list_processes(self): 
     print self.process.get_processes() 

    @property 
    def connected(self): 
     return self.manager._state.value == self.manager._state.STARTED 

    def _logmessage(self, msg): 
     print "%s: %s" % (time.strftime('%Y-%m-%d %H:%M:%S'), msg) 


def test(data): 
    while True: 
     print time.time() 
     time.sleep(1.) 


if __name__ == '__main__': 
    from algotrading.server.process_client import Client 
    client = Client(authkey='abc') 
    client.connect() 
    client.start_process("algotrading.server.process_client", "test") 
    client.list_processes() 
+0

출처를 공유 할 수 있습니까? –

답변

0

클라이언트를 청취하고 알고리즘을 실행하기 위해 스레드를 시작하는 소켓 서버를 구현할 수 있습니다.

RPC가 가장 간단한 해결책이라고 생각합니다.

일부 영감 : What is the current choice for doing RPC in Python?

+1

죄송합니다. 제 질문을 명확하게 표현하지 못했을 수 있습니다. 나는'multiprocessing' 패키지로이 작업을하려고합니다. 나는 이것을 처리하기 위해'관리자 (Manager) '를 사용할 수 있다고 생각했다. – Morten

0

체크 아웃 Supervisord 프로세스의 원격 관리, 플러스 자동 시작/재시작 설정 기능이 가능합니다.

확장 성 및 재난 복구 필요성에 따라 여러 서버를 실행하는 동안 "모니터링/거래 프로세스"를 분산시킬 수 있습니다. supervisord는 실제로 한 대의 컴퓨터 만 관리하도록 설계된 반면, xml-rpc 인터페이스를 통해 여러 개의 서버 (각 supervisord 실행)를 조정하는 관리자 앱을 만들 수 있습니다.

Cron 또는 Celery를 매일 시작/중지 일정에 사용할 수 있습니다.