São Python, variáveis globais thread-safe?
Pergunta
editar:im perguntando se variáveis globais são seguros em um single-threaded framework web como furacão
estou usando o mongoengine orm, que obtém uma conexão de banco de dados de uma variável global:
_get_db() # gets the db connection
também estou usando o tornado, um single-threaded framework web em python.em um determinado ponto de vista, eu preciso pegar uma conexão de banco de dados e eliminar referência a um DBRef
[objeto semelhante a uma chave estrangeira]:
# dereference a DBRef
_get_db().dereference(some_db_ref)
uma vez que a conexão devolvidos por _get_db
é um var global, há possibilidade de colisão e o errado valor a ser devolvido para o thread errado?
Solução
Supondo que MongoEngine é de moldagem PyMongo (e creio que é), então você deve ser fino.PyMongo é completamente thread-safe.
Outras dicas
Threads são sempre necessários para manter o GIL quando interagindo com objetos Python.O espaço de nomes segurando as variáveis é um objeto Python (um frameobject ou um dict, dependendo do tipo de variável que é.) É sempre mais seguro para obter ou definir variáveis em vários segmentos.Você nunca vai conseguir dados de lixo.
No entanto, a corrida de costume condições aplicam-se para o objeto que você conseguir, ou qual objeto você substituir quando você atribuir.Uma declaração como x += 1
é não thread-safe, porque um thread diferente pode executar entre o get e o armazenamento, alterar o valor da x
, o que você faria, então, substituir.
Não, mas bloqueios são bastante simples para usar em python.Use o tentar:finalmente:padrão para garantir que um bloqueio é liberado após você modificar sua variável global.
Não há nada sobre globais que torna-los mais ou menos thread-safe do que todas as outras variáveis.Se é possível ou não por uma operação falhar ou devolver resultados incorrectos quando executar em diferentes segmentos, a melhor prática é que você deve proteger os dados compartilhados entre threads.
Se eu estou lendo certo, você está perguntando se uma variável está seguro em um single-threaded ambiente.Neste caso, onde os dados são não compartilhada entre processos concorrentes, a variável é seguro (afinal, não há nada de mais em execução que pode interrompê-lo).