Eu tenho uma aula que contém um dicionário
class OrderBook:
orders = {'Restaurant1': None,
'Restaurant2': None,
'Restaurant3': None,
'Restaurant4': None}
@staticmethod
def addOrder(restaurant_name, orders):
OrderBook.orders[restaurant_name] = orders
E estou executando 4 threads (um para cada restaurante) que chamam o método OrderBook.addOrder
. Aqui está a função executada por cada thread:
def addOrders(restaurant_name):
#creates orders
...
OrderBook.addOrder(restaurant_name, orders)
É seguro ou preciso usar uma fechadura antes de ligar addOrder
?
Respostas:
As estruturas integradas do Python são thread-safe para operações únicas, mas às vezes pode ser difícil ver onde uma instrução realmente se torna várias operações.
Seu código deve estar seguro. Lembre-se: um bloqueio aqui quase não adicionará sobrecarga e proporcionará tranquilidade.
http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm tem mais detalhes.
fonte
Sim, os tipos integrados são inerentemente thread-safe: http://docs.python.org/glossary.html#term-global-interpreter-lock
fonte
O guia de estilo do Google desaconselha confiar na atomicidade de dict
Explicado com mais detalhes em: A atribuição de variável do Python é atômica?
E eu concordo com este: já existe o GIL no CPython, então o impacto no desempenho do uso de um Lock será insignificante. Muito mais caras serão as horas gastas na caça de bugs em uma base de código complexa quando os detalhes de implementação do CPython mudarem um dia.
fonte