Blokowanie jest możliwym rozwiązaniem, ale preferuję ogólną architekturę obsługi każdego zewnętrznego zasobu (w tym pliku) pojedynczym, osobnym wątkiem. Inne wątki wysyłają żądania pracy do dedykowanego wątku na instancję Queue.Queue (i dostarczają osobną kolejkę jako część parametrów żądania pracy, jeśli potrzebują wyniku), dedykowany wątek spędza większość czasu czekając na .get
na tym kolejka, a gdy tylko otrzyma żądanie, uruchamia się i wykonuje je (i jeśli to konieczne, zwraca wyniki w kolejce przekazanej).
Podałem szczegółowe przykłady tego podejścia, np. w "Python in a Nutshell". Kolejka Pythona jest wewnętrznie bezpieczna dla wątków i ogromnie upraszcza Twoje życie.
Zaletą tej architektury jest to, że przekłada się ona płynnie na multiprocessing, jeśli i kiedy zdecydujesz się na zamianę pracy na oddzielny proces zamiast na osobny wątek (np. W celu wykorzystania wielu rdzeni) - multiprocessing
zapewnia własną workalike Queue
wpisz, aby takie przejście gładkie jak jedwab ;-).
Jeśli piszę biblioteka, która powinna być bezpieczna dla wątków, ale nie zawsze jest używana w wątkach. Czy powinienem przyjąć takie podejście, czy spojrzeć na zamek? Nie jestem pewien, czy moja biblioteka powinna tworzyć nowe wątki, jeśli jest używany tylko jeden wątek. Jakie jest najlepsze rozwiązanie dla zmiennej liczby wątków, które mogą być jednym? –