2011-05-18 30 views
5

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

sonra istemci çalışır. İki süreçleri ( 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

cevap

1


birçok önce keşfettik.

Bu sizin sunucu görevleri için gönderir nerede görev sırası aradığınız bana sesler ve işçiler bu görevleri yürütmek.

Ben Celery bir göz atmanızı tavsiye ederim.

İlgili konular