kullanarak aşağıdaki kodu basit bir uzaktan dağıtıcısı inşa:düşünün multiprocessing.Managers
Sunucu:
import sys
from multiprocessing.managers import BaseManager, BaseProxy, Process
def baz(aa) :
l = []
for i in range(3) :
l.append(aa)
return l
class SolverManager(BaseManager): pass
class MyProxy(BaseProxy): pass
manager = SolverManager(address=('127.0.0.1', 50000), authkey='mpm')
manager.register('solver', callable=baz, proxytype=MyProxy)
def serve_forever(server):
try :
server.serve_forever()
except KeyboardInterrupt:
pass
def runpool(n):
server = manager.get_server()
workers = []
for i in range(int(n)):
Process(target=serve_forever, args=(server,)).start()
if __name__ == '__main__':
runpool(sys.argv[1])
Müşteri:
import sys
from multiprocessing.managers import BaseManager, BaseProxy
import multiprocessing, logging
class SolverManager(BaseManager): pass
class MyProxy(BaseProxy): pass
def main(args) :
SolverManager.register('solver')
m = SolverManager(address=('127.0.0.1', 50000), authkey='mpm')
m.connect()
print m.solver(args[1])._getvalue()
if __name__ == '__main__':
sys.exit(main(sys.argv))
Ben python server.py 1
olarak tek işlem kullanılarak sunucu çalıştırırsanız beklendiği gibi
python server.py 2
) bağlantıları için dinleme yumurtlamaya Ama eğer ben kötü bir hata alıyorum:
$python client.py ping
Traceback (most recent call last):
File "client.py", line 24, in <module>
sys.exit(main(sys.argv))
File "client.py", line 21, in main
print m.solver(args[1])._getvalue()
File "/usr/lib/python2.6/multiprocessing/managers.py", line 637, in temp
authkey=self._authkey, exposed=exp
File "/usr/lib/python2.6/multiprocessing/managers.py", line 894, in AutoProxy
incref=incref)
File "/usr/lib/python2.6/multiprocessing/managers.py", line 700, in __init__
self._incref()
File "/usr/lib/python2.6/multiprocessing/managers.py", line 750, in _incref
dispatch(conn, None, 'incref', (self._id,))
File "/usr/lib/python2.6/multiprocessing/managers.py", line 79, in dispatch
raise convert_to_error(kind, result)
multiprocessing.managers.RemoteError:
---------------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python2.6/multiprocessing/managers.py", line 181, in handle_request
result = func(c, *args, **kwds)
File "/usr/lib/python2.6/multiprocessing/managers.py", line 402, in incref
self.id_to_refcount[ident] += 1
KeyError: '7fb51084c518'
---------------------------------------------------------------------------
Benim fikrim oldukça basittir. Aynı soketi paylaşacak ve istekleri bağımsız olarak ele alacak birkaç işçiyi yaratacak bir sunucu oluşturmak istiyorum. Belki yanlış aracı kullanıyorum?
amaç yok
tüm istekler bir http sunucusu üzerinden ele ve daha sonra bir kümede oturan düğümlerine ve çoklu yöneticileri aracılığıyla işçilere düğümler tarafından dağıtılıyor 3 katmanlı yapısı ... oluşturmaktır bir kamu sunucu, çekirdek sayısına bağlı olarak her makinede işçilerin makine ve sayısı x bir düğüm ... Ben daha sofistike bir kütüphane kullanabilirsiniz biliyorum ama böyle basit bir görev için I (ben sadece burada prototip ediyorum) Çok işlemcili kütüphaneyi kullanacaktım ... Bu mümkün mü yoksa diğer çözümleri doğrudan araştırmalı mıyım? Burada çalıştığım bir şeylere çok yakın olduğumu hissediyorum ... teşekkürler. Bir tekerleği icat çalışıyoruz