2011-08-16 17 views
12

उदाहरण के लिए, यदि मैं chain का उपयोग कर एक इटरेटर बना देता हूं, तो क्या मैं इसे एकाधिक धागे पर कॉल कर सकता हूं? ध्यान दें कि जीआईएल पर निर्भर थ्रेड-सुरक्षा स्वीकार्य है, लेकिन बेहतर नहीं है।क्या Itertools थ्रेड-सुरक्षित है?

(ध्यान दें कि यह this question से थोड़ा अलग है, जो जनरेटर से संबंधित है, सी में लिखे गए इटरेटर नहीं)।

उत्तर

11

सबसे पहले, official documentation on itertools में कुछ भी नहीं कहता कि वे थ्रेड-सुरक्षित हैं। तो ऐसा लगता है कि विनिर्देशन द्वारा पाइथन इसके बारे में कुछ भी गारंटी नहीं देता है। यह ज्योथन या पायपी जैसे कार्यान्वयन में अलग हो सकता है, लेकिन इसका मतलब है कि आपका कोड शायद पोर्टेबल नहीं होगा।

दूसरा, अधिकांश itertools (सरल लोगों के अपवाद के साथ, count) अन्य इटरेटर को उनके इनपुट के रूप में लें। थ्रेड-सुरक्षित तरीके से आपको इन इटरेटर को सही तरीके से व्यवहार करने की आवश्यकता होगी।

तीसरा, कुछ थियेटर द्वारा अलग-अलग उपयोग किए जाने पर कुछ इटरेटर समझ में नहीं आते हैं। उदाहरण के लिए izip एकाधिक धागे में काम कर कई स्रोतों से तत्वों को ले जाने की दौड़ की स्थिति में हो सकता है, विशेष रूप से समकक्ष पायथन कोड द्वारा परिभाषित किया गया है (क्या होगा जब एक थ्रेड केवल एक इनपुट इटरेटर से मूल्य ले लेगा, फिर उनमें से दो से दूसरा धागा ?)।

भी ध्यान रखें कि प्रलेखन का उल्लेख नहीं है कि itertools सी में लागू किया जाता है हम जानते हैं (एक कार्यान्वयन विस्तार के रूप में) है कि CPython के itertools वास्तव में सी में लिखे हैं, लेकिन अन्य कार्यान्वयन पर वे खुशी से जनरेटर के रूप में लागू किया जा सकता है, और आप question you cited पर वापस जा सकते हैं।

तो, नहीं, आप यह नहीं मान सकते कि वे थ्रेड-सुरक्षित हैं जब तक कि आप अपने लक्षित पायथन प्लेटफॉर्म के कार्यान्वयन विवरण नहीं जानते।

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