マルチプロセッシングを使用して、複数のバックグラウンド非同期関数を実行する必要があります。私は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ないと動作しません)。任意のアイデアをどのように動作させるか、それと同様にするには? :)
もう少し説明できますか? :)プールのように、代わりにp.close()を使用する必要がありますか? – sortas
@sortas私は答えを編集しました。いいえ、 'p.close()'は必要ありません。プールにのみこの機能があります。 – MegaIng
もう少し詳しく:共有された値を使用してプロセスの結果を返そうとしています。以下のようなもの: '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