मैं प्रक्रियाओं के समूह को चलाने के लिए मल्टीप्रोसेसिंग पूल का उपयोग करने का प्रयास कर रहा हूं, जिनमें से प्रत्येक ग्रीनलेट्स का एक गेवेन पूल चलाएगा। इसका कारण यह है कि बहुत सी नेटवर्क गतिविधि है, लेकिन बहुत सी सीपीयू गतिविधि भी है, इसलिए मेरी बैंडविड्थ और मेरे सभी सीपीयू कोर को अधिकतम करने के लिए, मुझे कई प्रक्रियाओं और गीवेंट की एसिंक बंदर पैचिंग की आवश्यकता है। मैं एक कतार बनाने के लिए मल्टीप्रोसेसिंग के प्रबंधक का उपयोग कर रहा हूं जो प्रक्रियाओं को संसाधित करने के लिए प्रक्रियाओं तक पहुंच जाएगा।गीवेंट बंदरगाहिंग ब्रेकिंग मल्टीप्रोसेसिंग
Traceback (most recent call last):
File "multimonkeytest.py", line 7, in <module>
q = manager.Queue()
File "/usr/local/Cellar/python/2.7.2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/managers.py", line 667, in temp
token, exp = self._create(typeid, *args, **kwds)
File "/usr/local/Cellar/python/2.7.2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/managers.py", line 565, in _create
conn = self._Client(self._address, authkey=self._authkey)
File "/usr/local/Cellar/python/2.7.2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/connection.py", line 175, in Client
answer_challenge(c, authkey)
File "/usr/local/Cellar/python/2.7.2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/connection.py", line 409, in answer_challenge
message = connection.recv_bytes(256) # reject large message
IOError: [Errno 35] Resource temporarily unavailable
मेरा मानना है कि यह सामान्य सॉकेट के व्यवहार के बीच कुछ अंतर के कारण होना चाहिए:
import multiprocessing
from gevent import monkey
monkey.patch_all(thread=False)
manager = multiprocessing.Manager()
q = manager.Queue()
यहाँ अपवाद यह उत्पादन होता है:
यहाँ कोड का एक सरलीकृत टुकड़ा है मॉड्यूल और गीवेंट सॉकेट मॉड्यूल।
यदि मैं उपप्रोसेसर के भीतर बंदरगाह करता हूं, तो कतार सफलतापूर्वक बनाई जाती है, लेकिन जब उपप्रोसेस कतार से() प्राप्त करने का प्रयास करता है, तो एक बहुत ही समान अपवाद होता है। Subprocesses में बड़ी संख्या में नेटवर्क अनुरोध करने के कारण सॉकेट को बंदरगाह की आवश्यकता होती है।
>>> gevent.version_info
(1, 0, 0, 'alpha', 3)
कोई भी विचार:
gevent का मेरा संस्करण है, जो मेरा मानना है कि नवीनतम है?
संबंधित: http://bugs.python.org/issue6056 – jfs