многопоточность передачи аргументов функции, но только запись в файл, если не присутствует - PullRequest
0 голосов
/ 11 апреля 2020

Построение этих вопросов: многопоточные процессы в 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) и тот же результат.

...