Saya memiliki kelas yang memegang kamus
class OrderBook:
orders = {'Restaurant1': None,
'Restaurant2': None,
'Restaurant3': None,
'Restaurant4': None}
@staticmethod
def addOrder(restaurant_name, orders):
OrderBook.orders[restaurant_name] = orders
Dan saya menjalankan 4 utas (satu untuk setiap restoran) yang memanggil metode tersebut OrderBook.addOrder
. Berikut adalah fungsi yang dijalankan oleh setiap utas:
def addOrders(restaurant_name):
#creates orders
...
OrderBook.addOrder(restaurant_name, orders)
Apakah ini aman, atau apakah saya harus menggunakan kunci sebelum menelepon addOrder
?
Jawaban:
Struktur built-in Python aman untuk thread untuk operasi tunggal, tetapi terkadang sulit untuk melihat di mana sebuah pernyataan benar-benar menjadi beberapa operasi.
Kode Anda harus aman. Perlu diingat: kunci di sini hampir tidak akan menambah biaya overhead, dan akan memberi Anda ketenangan pikiran.
http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm memiliki detail lebih lanjut.
sumber
Ya, tipe bawaan pada dasarnya aman untuk thread: http://docs.python.org/glossary.html#term-global-interpreter-lock
sumber
Panduan gaya Google menyarankan agar tidak mengandalkan dict atomicity
Dijelaskan lebih rinci di: Apakah tugas variabel Python atom?
Dan saya setuju dengan yang ini: sudah ada GIL di CPython, jadi kinerja hit menggunakan Lock akan diabaikan. Jauh lebih mahal adalah waktu yang dihabiskan untuk berburu bug dalam basis kode yang kompleks ketika detail implementasi CPython berubah suatu hari.
sumber