पायथन के शब्दकोश में थ्रेड सेफ्टी


105

मेरे पास एक वर्ग है जो एक शब्दकोश रखता है

class OrderBook:
    orders = {'Restaurant1': None,
              'Restaurant2': None,
              'Restaurant3': None,
              'Restaurant4': None}

    @staticmethod
    def addOrder(restaurant_name, orders):
        OrderBook.orders[restaurant_name] = orders

और मैं 4 धागे (प्रत्येक रेस्तरां के लिए एक) चला रहा हूं जो विधि को बुलाता है OrderBook.addOrder। यहां प्रत्येक थ्रेड द्वारा फ़ंक्शन चलाया जाता है:

def addOrders(restaurant_name):

    #creates orders
    ...

    OrderBook.addOrder(restaurant_name, orders)

क्या यह सुरक्षित है, या क्या मुझे कॉल करने से पहले लॉक का उपयोग करना होगा addOrder?


2
कैसे हो सकता है एक समस्या है जब प्रत्येक सूत्र एक अलग कुंजी को वैसे भी लिखता है।
जोहान रिट्जेल

63
@ जोचेन: कैसे dicts कार्यान्वित किया जाता है पर निर्भर करता है, बहुत कुछ गलत हो सकता है। यह एक बहुत ही उचित प्रश्न है।
नेड बाचेल्ड

जवाबों:


95

पायथन की निर्मित संरचनाएं एकल संचालन के लिए थ्रेड-सुरक्षित हैं, लेकिन कभी-कभी यह देखना मुश्किल हो सकता है कि एक बयान वास्तव में कई ऑपरेशन कहां हो जाता है।

आपका कोड सुरक्षित होना चाहिए। ध्यान रखें: यहाँ एक ताला लगभग कोई उपरी भाग नहीं जोड़ेगा, और इससे आपको मानसिक शांति मिलेगी।

http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm में अधिक विवरण हैं।


6
यहाँ effbot.org क्यों / कैसे / एक लॉक
हॉब्स

1
एकल ऑपरेशन बनाम समग्र संचालन पर विचार करना चाहिए, जैसे गेट-ऐड-सेट
एंडी

5
समस्या यह है कि जब मैं उस तानाशाही को बार-बार पढ़ / लिख रहा होता हूँ, तो मन की शांति मुझे बहुत अधिक खर्च होगी।
शिहाब शहरियार खान

2
"एक ताला यहाँ लगभग कोई उपरि नहीं जोड़ेगा": ऐसा क्यों है?
अधिकतम

32

हां, अंतर्निहित प्रकार स्वाभाविक रूप से थ्रेड-सुरक्षित हैं: http://docs.python.org/glossary.html#term-global-interpreter-lock

यह ऑब्जेक्ट मॉडल ( महत्वपूर्ण अंतर्निहित प्रकार जैसे कि तानाशाह सहित ) को सुरक्षित रूप से समवर्ती पहुंच के विरुद्ध सुरक्षित करके CPython कार्यान्वयन को सरल बनाता है ।


25
यह पाइथन की विशेषता नहीं है, बल्कि साइफन की विशेषता है
फ़िहाग

8
यह सच है, लेकिन जैसा कि मैं इसे समझता हूं, Jython और IronPython में बिल्ट-इन GIL के उपयोग के बिना भी थ्रेड-सुरक्षित हैं (और अनजाने में इसे निगल जाना चाहिए, क्या यह कभी उभरना चाहिए, GIL के साथ भी दूर करने का प्रस्ताव करता है)। मैंने मान लिया कि चूंकि वह दुभाषिया का उपयोग नहीं कर रहा था, इसलिए वह सीपीथॉन में था।

1
Jython के मामले में सही: jython.org/jythonbook/en/1.0/…
Evgeni Sergeev

9

Google की स्टाइल गाइड, तानाशाह की अमानवीयता पर भरोसा करने की सलाह देती है

आगे विस्तार से बताया गया है: क्या पायथन वैरिएबल असाइनमेंट परमाणु है?

अंतर्निहित प्रकारों की परमाणुता पर भरोसा न करें।

जबकि अजगर के अंतर्निहित ऐसे शब्दकोशों के रूप में डेटा प्रकार, दिखाई परमाणु संचालन के लिए वहाँ कोने मामलों में जहां वे परमाणु नहीं कर रहे हैं (उदाहरण के लिए यदि __hash__या __eq__अजगर तरीके के रूप में लागू किया जाता है) और उनके atomicity पर भरोसा नहीं किया जाना चाहिए। न तो आपको परमाणु चर असाइनमेंट पर भरोसा करना चाहिए (क्योंकि यह बदले में शब्दकोशों पर निर्भर करता है)।

Queueधागे के बीच डेटा संचार करने के लिए पसंदीदा तरीके के रूप में मॉड्यूल के क्यू डेटा प्रकार का उपयोग करें । अन्यथा, थ्रेडिंग मॉड्यूल और उसके लॉकिंग प्राइमेट का उपयोग करें। स्थिति चर के उचित उपयोग के बारे में जानें ताकि आप threading.Conditionनिचले स्तर के ताले का उपयोग करने के बजाय उपयोग कर सकें ।

और मैं इससे सहमत हूं: सीपीथॉन में पहले से ही जीआईएल है, इसलिए लॉक का उपयोग करने का प्रदर्शन नगण्य होगा। बहुत अधिक महंगा एक जटिल कोडबेस में बग शिकार करने में बिताए घंटे होंगे जब उन सीपीथॉन कार्यान्वयन विवरण एक दिन बदलते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.