Почему не работает multiprocessing.pool?

Всем привет! Занимаюсь парсингом и тут мне "взбрело" в голову проверить объект Pool() из multiprocessing.pool.
Набросал такой код:
from multiprocessing.pool import Pool


def a(s):
    with open('test.txt', 'a', encoding='utf-8') as f:
        f.write(s + '!\n')


def main():

    arr = []
    for i in range(1000):
        arr.append(str(i))

    with Pool(20) as p:
        p.map(a, arr)


if __name__ == '__main__':
    main()


И что же он мне выдал?!
В txt файле 500 с чем-то строк (:
Пробовал разное количество потоков ставить. Без толку - всегда меньше 1000 строк.
Корректно показал только при Pool(1) :)
Почему данный модуль работает некорректно и каким образом исправить данную проблему?
Всем спасибо!
  • Вопрос задан
  • 406 просмотров
Решения вопроса 1
ScriptKiddo
@ScriptKiddo
Увы, просто так из разных процессов в файл не получится записать.

Либо используйте FIleLock, для синхронизации процессов, либо переходите на SQLite или другую СУБД.
SQLite ставит БД на блокировку при записи из одного процесса. После завершения записи, разблокирует и дает возможность записать другим процессам.
https://www.sqlite.org/threadsafe.html

Сниппет для Filelock:
from filelock import Timeout, FileLock

lock = FileLock("high_ground.txt.lock")
with lock:
    open("high_ground.txt", "a").write("You were the chosen one.")

https://pypi.org/project/filelock/
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы