Tenho tido a necessidade de lidar com muitas bibliotecas de terceiros e teno percebi um erro (ou seria uma abordagem?) comum nas mais novas: quase nenhuma delas é thread-safe.Acredito que, com o modismo do uso de corrotinas (chamadas lightweight threads), os programadores mais novos passaram a considerar os threads de sistema obsoletos, deixando de tomar cuidados essenciais para boas bibliotecas.
Bem, tenho uma novidade para vocês: threads não são obsoletos e corrotinas não resolvem todos os problemas do mundo. Há situações em que usar corrotinas pode ser a melhor opção sim, mas em alguns casos os bons e velhos threads ainda são o salva vidas.
Para que isso seja possível, na criação de bibliotecas é necessário tomar alguns cuidados:
- Prefira sempre que possível usar objetos imutáveis. Prefira tuplas, strings, tipos numéricos básicos, etc.
- Evite permitir que objetos agregados façam alteração em seu objeto contentor sempre que possível.
- Em todos métodos e propriedades de um objeto que pode ser compartilhado (como o contentor citado) que alterem o estado do objeto, inicie com um
RLock, chamando seu métodoacquire, e encerre chamando seu métodorelease. Tome cuidado para que seja usada a mesma instância deRLock! - Não tenha medo de usar objetos do módulo
threading:Condition,Event,Lock,RLockeBoundedSemaphore. Eles são seus amigos. ;-) - Se estiver difícil escrever testes, substitua
threadingpordummy_threadingpara os testes unitários, mas usethreadingpara testes de aceitação.
[]’s
Cacilhας, La Batalema
CC-BY: Os textos deste blog podem ser reporduzidos contanto que sejam informados autor e origem.