2011-05-18 14 views
5

का उपयोग कर एक सरल दूरदराज के डिस्पैचर निर्माण पर विचार करें:निम्नलिखित कोड multiprocessing.Managers

सर्वर:

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]) 

ग्राहक:

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)) 

अगर मैं सर्वर python server.py 1 के रूप में केवल एक ही प्रक्रिया का उपयोग कर चलाते हैं

तो ग्राहक अपेक्षा के अनुसार काम करता है। लेकिन अगर मैं दो प्रक्रियाओं (python server.py 2) कनेक्शन के लिए सुन अंडे, मैं एक बुरा त्रुटि मिलती है:

$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' 
--------------------------------------------------------------------------- 

मेरा विचार बहुत सरल है। मैं एक ऐसा सर्वर बनाना चाहता हूं जो कई श्रमिकों को जन्म देगा जो एक ही सॉकेट साझा करेंगे और स्वतंत्र रूप से अनुरोधों को संभाल लेंगे। शायद मैं यहाँ गलत उपकरण का उपयोग कर रहा हूँ?

लक्ष्य एक 3-स्तरीय संरचना जहां सभी अनुरोधों को एक http सर्वर के माध्यम से नियंत्रित किया जाता है और फिर एक समूह में बैठे नोड्स और बहु ​​प्रबंधकों के माध्यम से श्रमिकों के लिए नोड्स से रवाना ...

नहीं है का निर्माण करना है एक सार्वजनिक सर्वर, प्रत्येक मशीन पर एक नोड प्रति मशीन और श्रमिकों की संख्या संख्या के आधार पर प्रत्येक मशीन पर ... मुझे पता है कि मैं एक और परिष्कृत पुस्तकालय का उपयोग कर सकता हूं, लेकिन इस तरह के एक साधारण कार्य के लिए (मैं बस यहाँ प्रोटोटाइप कर रहा हूं) I बस मल्टीप्रोसेसिंग लाइब्रेरी का उपयोग करेगा ... क्या यह संभव है या मुझे सीधे अन्य समाधानों का पता लगाना चाहिए? मुझे लगता है कि मैं यहाँ कुछ काम करने के करीब हूं ... धन्यवाद।

उत्तर

1


आप एक पहिया आविष्कार करने के लिए कोशिश कर रहे हैं, कई से पहले का आविष्कार किया है।

यह मुझे लगता है कि आप कार्य कतार की तलाश में हैं जहां आपका सर्वर कार्य भेजता है, और आपके कर्मचारी इस कार्य को निष्पादित करते हैं।

मैं आपको Celery पर एक नज़र रखने की सलाह दूंगा।

संबंधित मुद्दे