importar dentro de um thread do Python
Eu tenho algumas funções que interativamente carregam módulos python usando__import__
Eu recentemente deparei com algum artigo sobre um "bloqueio de importação" em Python, isto é, um bloqueio especificamente para importações (não apenas o GIL). Mas o artigo era antigo, então talvez isso não seja mais verdade.
Isso me faz pensar sobre a prática de importação em um segmento.
Estáimport
/__import__
discussão segura?Eles podem criar fechaduras mortas?Eles podem causar problemas de desempenho em um aplicativo encadeado?EDIT 12 de setembro de 2012
Obrigado pela grande resposta Soravux. Portanto, a importação é thread-safe, e não me preocupo com deadlocks, já que as funções que usam__import__
no meu código não ligue uns aos outros.
Você sabe se o bloqueio é adquirido mesmo que o módulo já tenha sido importado? Se for esse o caso, eu provavelmente deveria procurar em sys.modules para verificar se o módulo já foi importado antes de fazer uma chamada para__import__
.
Claro que isso não deve fazer muita diferença no CPython, já que existe o GIL. No entanto, isso poderia fazer muita diferença em outras implementações como Jython ou Python sem empilhamento.
EDIT 19 de setembro de 2012
Sobre o Jython, aqui está o que dizem no documento:
http://www.jython.org/jythonbook/en/1.0/Concurrency.html#module-import-lock
O Python, no entanto, define um bloqueio de importação de módulo, que é implementado pelo Jython. Esse bloqueio é adquirido sempre que uma importação de qualquer nome é feita. Isto é verdade se a importação passa pela declaração de importação, o equivalente__import__
embutido, ou código relacionado. É importante observar que, mesmo que o módulo correspondente já tenha sido importado, o bloqueio de importação do módulo ainda será adquirido, ainda que brevemente.
Então, parece que faria sentido verificar em sys.modules antes de fazer uma importação, para evitar a aquisição do bloqueio. O que você acha?