파이썬을 사용하여 알고리즘 거래 플랫폼을 구축 중입니다. 여러 알고리즘이 시장을 모니터링하고 매일 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()
출처를 공유 할 수 있습니까? –