0
0 Комментариев

Доброго времени суток.

Есть код, который одновременно запускает несколько асинхронных процессов по списку. Нужно из каждого процесса получить результат, и обновить статус в базе. Пример кода:

from time import sleep
from multiprocessing import Process, Value
import subprocess
 
def worker_email(keyword, func_result):
    subprocess.Popen(["python", "mongoworker.py", str(keyword)])
    func_result.value = 1
    return True
 
keywords_list = ['apple', 'banana', 'orange', 'strawberry']
 
if __name__ == '__main__':
    for keyword in keywords_list:
        # Выполняю задачу
        func_result = Value('i', 0)
        p = Process(target=worker_email, args=(keyword,func_result))
        p.start()
        # Обновляю статус задачи
        if func_result.value == 1:
            stream.update_one({'_id': doc['_id']}, {"$set": {"status": True}}, upsert=False)

В чем проблема: если использовать p.join(), то все работает, но процессы выполняются по очереди. Если не использовать, то процессы не закрываются, и статус не обновляется. Рабочий вариант — выполнять не код функции, а subprocess.Popen, но это выглядит как-то нецензурно.

Собственно, буду рад любому совету :)


Добавить комментарий