का उपयोग कर एक सरल दूरदराज के डिस्पैचर निर्माण पर विचार करें:निम्नलिखित कोड 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 बस मल्टीप्रोसेसिंग लाइब्रेरी का उपयोग करेगा ... क्या यह संभव है या मुझे सीधे अन्य समाधानों का पता लगाना चाहिए? मुझे लगता है कि मैं यहाँ कुछ काम करने के करीब हूं ... धन्यवाद।