পাইথনের অভিধানে থ্রেড সুরক্ষা


110

আমার একটি ক্লাস রয়েছে যা অভিধান রাখে

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?


4
যখন প্রতিটি থ্রেড যেভাবেই একটি আলাদা কীতে লিখবে তখন কীভাবে সমস্যা হতে পারে।
জোচেন রিটজেল

67
@ জোচেন: কীভাবে ডিক্ট প্রয়োগ করা হয় তার উপর নির্ভর করে প্রচুর পরিমাণে ভুল হতে পারে। এটি একটি খুব যুক্তিসঙ্গত প্রশ্ন।
নেড ব্যাচেল্ডার

উত্তর:


98

পাইথনের অন্তর্নির্মিত কাঠামোগুলি একক ক্রিয়াকলাপের জন্য থ্রেড-নিরাপদ, তবে কোনও বিবৃতিটি সত্যই একাধিক ক্রিয়াকলাপে পরিণত হয় তা কখনও কখনও দেখা কঠিন hard

আপনার কোডটি নিরাপদ হওয়া উচিত। মনে রাখবেন: এখানে একটি লক প্রায় কোনও ওভারহেড যোগ করবে না, এবং আপনাকে মানসিক শান্তি দেবে।

http://effbot.org/pyfaq/ কি-kinds-of-global-value-mutes-are-thread-safe.htm এর আরও বিশদ রয়েছে।


6
এখানে effbot.org কেন-টু / কীভাবে উপর একটি লক বাস্তবায়নের
hobs

4
একক অপারেশন বনাম যৌগিক ক্রিয়াকলাপগুলি যেমন গেট-অ্যাড-সেট বিবেচনা করা উচিত
অ্যান্ডি

5
সমস্যাটি হ'ল, যখন আমি প্রায়শই এই ডিকটি পড়ি / লিখছি, তখন মনে প্রশান্তি আমার অনেক বেশি ব্যয় করবে।
শিহাব শাহরিয়ার খান

4
"এখানে একটি লক প্রায় কোনও ওভারহেড যোগ করবে না": এটি কেন?
সর্বোচ্চ

32

হ্যাঁ, অন্তর্নির্মিত প্রকারগুলি অন্তর্নিহিতভাবে থ্রেড-নিরাপদ: http://docs.python.org/glossary.html#term-global-interpreter-lock

এটি সিপিথন বাস্তবায়নকে অবজেক্ট মডেল তৈরি করে ( ডিকের মতো সমালোচিত বিল্ট-ইন প্রকার সহ ) একযোগে অ্যাক্সেসের বিরুদ্ধে পরিষ্কারভাবে নিরাপদ করে তোলে ।


28
এটি পাইথনের বৈশিষ্ট্য নয়, সিপাইথনের বৈশিষ্ট্য ।
ফিহাগ

8
সত্য, তবে আমি যেমন এটি বুঝতে পেরেছি, জিলন এবং আয়রন পাইথনের বিল্ট-ইনগুলিও জিআইএল ব্যবহার না করেও থ্রেড-নিরাপদ (এবং এটি অপ্রকাশিত গিলে, এটি কখনও উত্থাপিত হওয়া উচিত, জিআইএলকেও বাদ দেওয়ার প্রস্তাব দেয়)। আমি ধরে নিয়েছি যেহেতু তিনি যে দোভাষীটি তিনি ব্যবহার করছেন তা নির্দিষ্ট করে দেয়নি, তার অর্থ তিনি সিপিথনে ছিলেন।

4
: Jython ক্ষেত্রে সংশোধন jython.org/jythonbook/en/1.0/...
Evgeni Sergeev

10

গুগলের স্টাইল গাইড ডিক পারমাণবিকতার উপর নির্ভর করার বিরুদ্ধে পরামর্শ দেয়

এখানে আরও বিশদে ব্যাখ্যা করা হয়েছে: পাইথন ভেরিয়েবল অ্যাসাইনমেন্ট কি পারমাণবিক?

অন্তর্নির্মিত প্রকারের পারমাণবিকতার উপর নির্ভর করবেন না।

পাইথনের অন্তর্নির্মিত ডাটা ধরণের যেমন অভিধানগুলিতে পারমাণবিক অপারেশন রয়েছে বলে মনে হয়, এমন কোণার কেস রয়েছে যেখানে সেগুলি পারমাণবিক নয় (যেমন যদি __hash__বা__eq__ পাইথন পদ্ধতি হিসাবে প্রয়োগ করা হয় প্রয়োগ করা হয়) এবং তাদের পারমাণবিকতার উপর নির্ভর করা উচিত নয়। উভয়ই আপনাকে পারমাণবিক পরিবর্তনশীল কার্যভারের উপর নির্ভর করা উচিত নয় (যেহেতু এটি অভিধানের উপর নির্ভর করে)।

Queueথ্রেডের মধ্যে ডেটা যোগাযোগের জন্য পছন্দসই উপায় হিসাবে মডিউলটির ক্যু ডেটা টাইপ ব্যবহার করুন । অন্যথায়, থ্রেডিং মডিউল এবং এর লকিং আদিম ব্যবহার করুন। শর্ত ভেরিয়েবলগুলির যথাযথ ব্যবহার সম্পর্কে জানুন যাতে আপনি threading.Conditionনিম্ন-স্তরের লকগুলি ব্যবহার না করে ব্যবহার করতে পারেন ।

এবং আমি এটির সাথে একমত: সিপিথনে ইতিমধ্যে জিআইএল রয়েছে, তাই লক ব্যবহারের পারফরম্যান্স হিট নগণ্য হবে। এই সিপিথন বাস্তবায়নের বিশদটি যখন একদিন পরিবর্তন হয় তখন জটিল কোডবেজে বাগ বাগের শিকার করতে ব্যয় করা ঘন্টাগুলি আরও অনেক ব্যয়বহুল হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.