複数のプロセスを非同期で実行して応答を送信できる関数を作成しようとしていました。 multiprocessing.Process()
が応答を返さないので、私のように関数を作成するものと考える:この関数内で複数の非同期関数を実行し、各関数の戻り値を取得します。
from multiprocessing import Process
def async_call(func_list):
"""
Runs the list of function asynchronously.
:param func_list: Expects list of lists to be of format
[[func1, args1, kwargs1], [func2, args2, kwargs2], ...]
:return: List of output of the functions
[output1, output2, ...]
"""
response_list = []
def worker(function, f_args, f_kwargs, response_list):
"""
Runs the function and appends the output to list
"""
response = function(*f_args, **f_kwargs)
response_list.append(response)
processes = [Process(target=worker, args=(func, args, kwargs, response_list)) \
for func, args, kwargs in func_list]
for process in processes:
process.start()
for process in processes:
process.join()
return response_list
、私はlist
として追加のパラメータを受け入れる非同期worker
を呼び出します。リストは参照として渡されるので、リスト内に実際の関数の応答を追加できると思った。そしてasync_call
は私にすべての機能の応答を返します。
しかし、これは期待どおりの動作ではありません。値はworker()
内のlist
に付加されますが、ワーカーresponse_list
のリストの外は空のままです。
私が間違っていることは何ですか?そして、私がやっていることを達成するための選択肢はありますか?
それを手に入れました。私は 'queue.put()'を実行しているアイテムに対して 'queue.get()'を実行するだけです。それ以上のアクセス項目については、フリーズします。だから私は 'func_list'の' len'のためにそれを繰り返しています。これを行うより良い方法はありますか? –
値を関数にマップする方法はありますか?ハックとして、私は関数のインデックスとして1つのキーでdictオブジェクトを返し、キーにソートを返しながら考えることができます。これを達成するための他のもっとpythonicな方法はありますか? –