1

다중 처리를 사용하여 백그라운드 비동기 함수를 여러 개 실행해야합니다. Popen 솔루션을 사용하고 있지만 부 자연스럽게 보입니다. 예 :다중 처리를 사용하여 파이썬에서 여러 비동기 프로세스를 실행하는 방법은 무엇입니까?

def worker_email(keyword): 
    print('Before:' + keyword) 
    sleep(10) 
    print('After:' + keyword) 
    return True 

기능이 하나씩, 아니 비동기을 실행

from time import sleep 
from multiprocessing import Process, Value 
import subprocess 

def worker_email(keyword): 
    subprocess.Popen(["python", "mongoworker.py", str(keyword)]) 
    return True 

keywords_list = ['apple', 'banana', 'orange', 'strawberry'] 

if __name__ == '__main__': 
    for keyword in keywords_list: 
     # Do work 
     p = Process(target=worker_email, args=(keyword,)) 
     p.start() 
     p.join() 

내가 좋아하는,는 popen을 사용하지하려고하면

. 그래서 Popen을 사용하지 않고 동시에 모든 기능을 실행하는 방법은 무엇입니까?

UPD : 내가 좋아하는, 프로세스에서 결과를 반환 multiprocessing.Value을 사용하고 있습니다 :

def worker_email(keyword, func_result): 
    sleep(10) 
    print('Yo:' + keyword) 
    func_result.value = 1 
    return True 

func_result = Value('i', 0) 
p = Process(target=worker_email, args=(doc['check_id'],func_result)) 
p.start() 
# Change status 
if func_result.value == 1: 
    stream.update_one({'_id': doc['_id']}, {"$set": {"status": True}}, upsert=False) 

하지만 .join없이 작동하지 않습니다(). 어떤 아이디어를 어떻게 작동 시키거나 비슷한 방법으로 만드나요? :)

답변

1

p.join() 줄을 제거하면 제대로 작동합니다. 더 이상 실행하기 전에 프로세스가 끝날 때까지 기다리고 싶다면 p.join 만 필요합니다. 프로그램의 마지막에 python은 닫히기 전에 모든 프로세스가 끝날 때까지 기다리기 때문에 걱정할 필요가 없습니다.

+0

조금 더 설명 할 수 있습니까? :) 그리고 풀 대신 p.close()를 사용해야합니까? – sortas

+0

@sortas 나는 대답을 편집했다. 아니,'p.close()'는 필요 없다. 풀에만이 기능이 있습니다. – MegaIng

+0

한 번 더 자세히 설명 : 공유 값을 사용하여 프로세스의 결과를 반환하려고합니다. 같은 : 'func_result = 값 ('I'는, 0) p = 프로세스 (목표 = worker_email, 인수의 = (문서 [ 'check_id'] func_result)) p.start()를 # Обновляю статус задачи на "Выполнено"(если все ок) или не меняю статус и отправляю на повторое выполнение (если не ок) 경우 func_result.value == 1 : stream.update_one ({ '_ ID'문서 [ '_ ID']}, { "$ set": { "status": True}}, upsert = False)' 하지만 지금 가입하지 않고는 할 수 없습니다 :) 어떤 아이디어가 있습니까? – sortas

0

결과 확인 및 상태 업데이트를 작업자 기능으로 전송하여 처리 결과를 가져 오는 중 해결 된 문제점. 다음과 같음 :

# Update task status if work is done 
def update_status(task_id, func_result): 
    # Connect to DB 
    client = MongoClient('mongodb://localhost:27017/') 
    db = client.admetric 
    stream = db.stream 

    # Update task status if OK 
    if func_result: 
     stream.update_one({'_id': task_id}, {"$set": {"status": True}}, upsert=False) 

    # Close DB connection 
    client.close() 

# Do work 
def yo_func(keyword): 
    sleep(10) 
    print('Yo:' + keyword) 
    return True 

# Worker function 
def worker_email(keyword, task_id): 
    update_status(task_id, yo_func(keyword))