Построение этих вопросов: многопоточные процессы в python, использующие очередь для записи в файл, проверяя, была ли выполнена работа и Python многопроцессорная безопасная запись в файл
У меня есть код, который, я думаю, почти работает:
from multiprocessing.dummy import Pool as ThreadPool
import multiprocessing as mp
def func(a, q):
pthData = "C:/temp/temp.txt"
with open(pthData, 'r') as file:
done = file.read().splitlines()
if a in done:
return 'done'
q.put(a)
listener(q)
return a
def listener(q):
pthData = "C:/temp/temp.txt"
while 1:
m = q.get()
if m == 'kill':
break
with open(pthData, 'a') as the_file:
the_file.write( m + '\n')
if __name__ == '__main__':
a = ['a', 'b', 'c', 'd', 'a', 'b', 'e', 'a', 'g']
pool = ThreadPool(10)
manager = mp.Manager()
q = manager.Queue()
watcher = pool.apply_async(listener, (q,))
results = [pool.apply_async(func, (item, q)) for item in a]
for result in results:
print(result.successful())
q.put('kill')
# Close the pool and wait for the work to finish
pool.close()
pool.join()
В зависимости от количества потоков в пуле я вижу дубликаты в файле temp.txt, например, с 10 потоками я вижу:
g
b
e
c
a
a
d
a
b
Это потому, что я добавляю в очередь перед проверкой на наличие дубликатов, так как имеется 10 потоков? Если я попробую это с 1 темы, ничего не будет написано.
Также этот код завершается ошибкой
raise ValueError("{0!r} not ready".format(self))
ValueError: <multiprocessing.pool.ApplyResult object at 0x000002C77DDBEF48> not ready
Почему не все потоки готовы? Я запустил скрипт в cmd (>> python file.py
) и тот же результат.