ホームページ  >  記事  >  バックエンド開発  >  Python の concurrent future モジュールの概要 (コード)

Python の concurrent future モジュールの概要 (コード)

不言
不言オリジナル
2018-08-30 09:55:402608ブラウズ

この記事では、Python の concurrent future モジュールについての紹介 (コード) を紹介します。一定の参考値があります。必要な友人は参照してください。お役に立てれば幸いです。

concurrent.futures モジュール

このモジュールの主な機能は、ThreadPoolExecutor クラスと ProcessPoolExecutor クラスです。どちらのクラスも concurrent.futures._base.Executor クラスを継承しています。それらが実装するインターフェイスは使用できます。さまざまな Cal​​lable オブジェクトはスレッドまたはプロセスで実行され、それらはすべて内部的にワーカー スレッドまたはプロセス プールを維持します。

ThreadPoolExecutor クラスと ProcessPoolExecutor クラスは高度なクラスであり、ほとんどの場合、実装の詳細に注意を払うことなく、使い方を学ぶだけで十分です。

#ProcessPoolExecutor クラス

>class ThreadPoolExecutor(concurrent.futures._base.Executor)

>|  This is an abstract base class for concrete asynchronous executors.

>|  Method resolution order:

>|      ThreadPoolExecutor

 |      concurrent.futures._base.Executor

 |      builtins.object

 |

 |  Methods defined here:

 |

 |  init(self, max_workers=None, thread_name_prefix='')

 |      Initializes a new ThreadPoolExecutor instance.

 |

 |      Args:

 |          max_workers: The maximum number of threads that can be used to

 |              execute the given calls.

 |          thread_name_prefix: An optional name prefix to give our threads.

 |

 |  shutdown(self, wait=True)

 |      Clean-up the resources associated with the Executor.

 |

 |      It is safe to call this method several times. Otherwise, no other

 |      methods can be called after this one.

 |

 |      Args:

 |          wait: If True then shutdown will not return until all running

 |              futures have finished executing and the resources used by the

 |              executor have been reclaimed.

 |

 |  submit(self, fn, *args, **kwargs)

 |      Submits a callable to be executed with the given arguments.

 |

 |      Schedules the callable to be executed as fn(*args, **kwargs) and returns

 |      a Future instance representing the execution of the callable.

 |

 |      Returns:

 |          A Future representing the given call.

 |

 |  ----------------------------------------------------------------------

 |  Methods inherited from concurrent.futures._base.Executor:

 |

 |  enter(self)

 |

 |  exit(self, exc_type, exc_val, exc_tb)

 |

 |  map(self, fn, *iterables, timeout=None, chunksize=1)

 |      Returns an iterator equivalent to map(fn, iter).

 |

 |      Args:

 |          fn: A callable that will take as many arguments as there are

 |              passed iterables.

 |          timeout: The maximum number of seconds to wait. If None, then there

 |              is no limit on the wait time.

 |          chunksize: The size of the chunks the iterable will be broken into

 |              before being passed to a child process. This argument is only

 |              used by ProcessPoolExecutor; it is ignored by

 |              ThreadPoolExecutor.

 |

 |      Returns:

 |          An iterator equivalent to: map(func, *iterables) but the calls may

 |          be evaluated out-of-order.

 |

 |      Raises:

 |          TimeoutError: If the entire result iterator could not be generated

 |              before the given timeout.

 |          Exception: If fn(*args) raises for any values.
初期化では、パラメータ max_workers の値としてプロセスの最大数を指定できます。通常、この値は指定する必要はありません。デフォルトは次の数です。現在実行中のマシンのコア数 (os.cpu_count() によって取得できます); このクラスには次のメソッドが含まれています:
  1. map() メソッド。メソッドmap()、つまりマッピング内で、パラメータは次のとおりです:
  • 呼び出し可能な関数 fn
  • イテレータ iterables
  • タイムアウト期間 timeout
  • チャンク数 chunksize が 1 より大きい場合、イテレータはチャンクで処理されます

---->> この関数の特徴: 返される結果は、通話が開始された順序と一致します。通話プロセス中にブロックは発生しません。後者の実行は、前者が呼び出される前に終了している可能性があります。

処理前にすべての結果を取得する必要がある場合は、submit() メソッドを futures.as_completed 関数と組み合わせて使用​​することを選択できます。
  1. shutdown() メソッドは、現在のエグゼキュータ (エグゼキュータ) に関連するすべてのリソースをクリーンアップします。
  2. submit() メソッドは、呼び出し可能なオブジェクトは fn
  3. concurrent.futures._base.Executor から __enter__() メソッドと __exit__() メソッドを継承します。これは、ProcessPoolExecutor オブジェクトを with ステートメントで使用できることを意味します。

from concurrent import futures
with futures.ProcessPoolExecutor(max_works=3) as executor:
     executor.map()

ThreadPoolExecutor クラス

class ThreadPoolExecutor(concurrent.futures._base.Executor)

 |  This is an abstract base class for concrete asynchronous executors.

 |

 |  Method resolution order:

 |      ThreadPoolExecutor

 |      concurrent.futures._base.Executor

 |      builtins.object

 |

 |  Methods defined here:

 |

 |  init(self, max_workers=None, thread_name_prefix='')

 |      Initializes a new ThreadPoolExecutor instance.

 |

 |      Args:

 |          max_workers: The maximum number of threads that can be used to

 |              execute the given calls.

 |          thread_name_prefix: An optional name prefix to give our threads.

 |

 |  shutdown(self, wait=True)

 |      Clean-up the resources associated with the Executor.

 |

 |      It is safe to call this method several times. Otherwise, no other

 |      methods can be called after this one.

 |

 |      Args:

 |          wait: If True then shutdown will not return until all running

 |              futures have finished executing and the resources used by the

 |              executor have been reclaimed.

 |

 |  submit(self, fn, *args, **kwargs)

 |      Submits a callable to be executed with the given arguments.

 |

 |      Schedules the callable to be executed as fn(*args, **kwargs) and returns

 |      a Future instance representing the execution of the callable.

 |

 |      Returns:

 |          A Future representing the given call.

 |

 |  ----------------------------------------------------------------------

 |  Methods inherited from concurrent.futures._base.Executor:

 |

 |  enter(self)

 |

 |  exit(self, exc_type, exc_val, exc_tb)

 |

 |  map(self, fn, *iterables, timeout=None, chunksize=1)

 |      Returns an iterator equivalent to map(fn, iter).

 |

 |      Args:

 |          fn: A callable that will take as many arguments as there are

 |              passed iterables.

 |          timeout: The maximum number of seconds to wait. If None, then there

 |              is no limit on the wait time.

 |          chunksize: The size of the chunks the iterable will be broken into

 |              before being passed to a child process. This argument is only

 |              used by ProcessPoolExecutor; it is ignored by

 |              ThreadPoolExecutor.

 |

 |      Returns:

 |          An iterator equivalent to: map(func, *iterables) but the calls may

 |          be evaluated out-of-order.

 |

 |      Raises:

 |          TimeoutError: If the entire result iterator could not be generated

 |              before the given timeout.

 |          Exception: If fn(*args) raises for any values.
は、ProcessPoolExecutor クラスとよく似ていますが、一方が処理プロセスであり、もう一方が処理スレッドである点が異なります。実際のニーズに合わせて。

from time import sleep, strftime
from concurrent import futures


def display(*args):
    print(strftime('[%H:%M:%S]'), end="")
    print(*args)


def loiter(n):
    msg = '{}loiter({}): doing nothing for {}s'
    display(msg.format('\t'*n, n, n))
    sleep(n)
    msg = '{}loiter({}): done.'
    display(msg.format('\t'*n, n))
    return n*10


def main():
    display('Script starting')
    executor = futures.ThreadPoolExecutor(max_workers=3)
    results = executor.map(loiter, range(5))
    display('results:', results)
    display('Waiting for inpidual results:')
    for i, result in enumerate(results):
        display('result {} : {}'.format(i, result))


if __name__ == '__main__':
    main()
実行結果:

[20:32:12]Script starting
[20:32:12]loiter(0): doing nothing for 0s
[20:32:12]loiter(0): done.
[20:32:12]      loiter(1): doing nothing for 1s
[20:32:12]              loiter(2): doing nothing for 2s
[20:32:12]results: <generator object Executor.map.<locals>.result_iterator at 0x00000246DB21BC50>
[20:32:12]Waiting for inpidual results:
[20:32:12]                      loiter(3): doing nothing for 3s
[20:32:12]result 0 : 0
[20:32:13]      loiter(1): done.
[20:32:13]                              loiter(4): doing nothing for 4s
[20:32:13]result 1 : 10
[20:32:14]              loiter(2): done.
[20:32:14]result 2 : 20
[20:32:15]                      loiter(3): done.
[20:32:15]result 3 : 30
[20:32:17]                              loiter(4): done.
[20:32:17]result 4 : 40
実行結果はマシンによって異なる場合があります。

この例では、max_workers=3 が設定されているため、コードの実行が開始されるとすぐに、loiter() 操作で 3 つのオブジェクト (0、1、2) が実行され、3 秒後に次の操作が実行されます。オブジェクト 0 が終了し、その結果が結果 0 になります。その後、オブジェクト 3 の実行が開始されます。同様に、オブジェクト 4 の実行時間は、オブジェクト 1 の実行結果である結果 1 が出力された後になります。

関連する推奨事項:

Python がフューチャーを通じて同時実行性の問題を処理する方法の詳細な例

###

以上がPython の concurrent future モジュールの概要 (コード)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。