1

マルチプロセッシングを使用して、複数のバックグラウンド非同期関数を実行する必要があります。私はPopenのソリューションを働いているが、それは少し不自然に見えます。例:関数は1対1、無非同期に実行マルチプロセッシングを使ってPythonで複数の非同期プロセスを実行するには?

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、引数=(DOC [ 'check_id']、func_result)) p.start() #Обновляюстатусзадачина "Выполнено"(есливсеок)илинеменяюстатусиотправляюнаповтороевыполнение(еслинеок) 場合func_result.value == 1: stream.update_one({ '_ ID':DOC [ '_ 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)) 
関連する問題