web-dev-qa-db-ja.com

pythonの非同期プログラミング

Pythonに非同期プログラミングの一般的な概念はありますか?関数の実行にどれだけ時間がかかっても、コールバックを関数に割り当てて実行し、すぐにメインプログラムフローに戻ることはできますか?

57
facha

ここを見てください:

Pythonの非同期プログラミング

非同期プログラミングとツイストの紹介

チェックアウトする価値:

asyncio(以前のTulip)はPython default branch にチェックインされました

2018年3月14日に編集

今日Python has asyncIO —非同期I/O、イベントループ、コルーチン、タスク 組み込み。

上記のリンクからの説明:

asyncIOモジュールは、コルーチンを使用してシングルスレッドの並行コードを作成するためのインフラストラクチャを提供し、ソケットおよびその他のリソースを介したI/Oアクセスの多重化、ネットワーククライアントおよびサーバーの実行、およびその他の関連するプリミティブ。パッケージの内容のより詳細なリストは次のとおりです。

  1. さまざまなシステム固有の実装を備えたプラグ可能なイベントループ。
  2. トランスポートおよびプロトコルの抽象化(Twistedのものと同様);
  3. tCP、UDP、SSL、サブプロセスパイプ、遅延呼び出しなどの具体的なサポート(一部はシステムに依存する場合があります)。
  4. concurrent.futuresモジュールのクラスを模倣しますが、イベントループでの使用に適合したFutureクラス。
  5. (PEP 380)からのyieldに基づいたコルーチンおよびタスク。順次コードを並行して記述するのに役立ちます。
  6. 先物およびコルーチンのキャンセルサポート。
  7. シングルスレッドのコルーチン間で使用する同期プリミティブ。スレッドモジュールのコルーチンを模倣します。
  8. ブロッキングI/O呼び出しを行うライブラリを絶対に積極的に使用する必要がある場合に、スレッドプールに作業を渡すためのインターフェイス。

非同期プログラミングは、従来の「順次」プログラミングよりも複雑です。一般的なトラップをリストし、それらを回避する方法を説明する asyncioページで開発 を参照してください。一般的な問題を検出するには、開発中にデバッグモードを有効にします。

またチェックアウトする価値があります:

Python with asyncIO)の非同期プログラミングのガイド

38

あなたが説明するもの(別の機能が実行されている間、メインプログラムフローはすぐに再開する)は、通常「非同期」(別名「イベント駆動」)プログラミングと呼ばれるものではなく、むしろ「マルチタスク」(別名「マルチスレッド」または「マルチプロセッシング」)です。標準ライブラリモジュールthreadingおよびmultiprocessing(マルチコアマシンでの実際の同時実行が可能です)で説明した内容を取得できます。

非同期(イベント駆動)プログラミングは、標準のPythonライブラリのasyncoreおよびasynchatモジュールのライブラリでサポートされています。内部的にはselectモジュールを使用します。これはWindowsではソケットのみをサポートしますが、Unixy OSでは任意のファイル記述子もサポートできます)。

非同期(イベント駆動型)プログラミングのより一般的な(ほとんどがネットワーク指向ですが、limitedではありません)サポートについては、- ツイスト サードパーティパッケージ。

59
Alex Martelli

皆さん、朗報です!

Python 3.4には、新しい野心的な非同期プログラミングが含まれます 実装

現在は tulip と呼ばれ、すでに active following があります。

PEP 3153:非同期IOサポート および PEP 3156:非同期IOサポートのリブート

Pythonで非同期コードを記述したい人には、現在いくつかのオプションがあります。

  • asyncoreおよびasynchat;
  • ほとんどの場合、選択モジュールに基づいた特別なもの。
  • Twistedgevent などのサードパーティライブラリを使用します。

残念ながら、これらのオプションにはそれぞれ欠点があり、このPEPは対処しようとします。

長い間Python標準ライブラリの一部であったにもかかわらず、asyncoreモジュールには、現代の非同期ネットワークモジュールの期待に耐えられない柔軟性のないAPIに続く基本的な欠陥があります。

さらに、そのアプローチは単純すぎるため、開発者が非同期ネットワークの可能性を十分に活用するために必要なすべてのツールを提供することはできません。

現在、本番環境で使用されている最も人気のあるソリューションには、サードパーティライブラリの使用が含まれます。これらはしばしば満足のいく解決策を提供しますが、これらのライブラリ間に互換性がないため、使用するライブラリにコードベースが非常に密に結合される傾向があります。

異なる非同期IOライブラリ間の移植性の現在の欠如は、サードパーティのライブラリ開発者にとって多くの重複した努力を引き起こします。十分に強力な抽象化とは、非同期コードが一度書かれただけで、どこでも使用されることを意味します。

これが 概要 の能力です。

19
Ivan Kharlamov

他の回答者は、Twistedを指摘しています。これは、非常に包括的ですばらしいフレームワークですが、私の意見では、非常に非Python的なデザインです。また、AFAICT、Twistedメインループを使用する必要があります。これは、独自のループを提供する他の何かを既に使用している場合に問題になる可能性があります。

以下は、threadingモジュールの使用方法を示す、不自然な例です。

from threading import Thread

def background_stuff():
  while True:
    print "I am doing some stuff"

t = Thread(target=background_stuff)
t.start()

# Continue doing some other stuff now

ただし、ほとんどすべての有用なケースでは、スレッド間で通信する必要があります。 同期プリミティブ を調べ、 並行性 の概念と関連する問題に精通する必要があります。

threadingモジュールは、使用方法がわかっている場合に、使用できる多くのそのようなプリミティブを提供します。

14
Jesse Dhillon

PythonのTwistedライブラリをチェックアウトすることをお勧めします。彼らは多くの便利なツールを提供します。

  1. 小さな入門書
  2. 延期および関連するもの
3
Aiden Bell

あなたは私のPython Asynchronous Programming tool: http://www.ideawu.com/blog/2010/08/delegate-in-pythonpython-asynchronous-programming.html

インポート時間、ランダム、sys 
 fromデリゲートインポート* 
 
 def proc(a):
 time.sleep(random.random() )
 return str(a)
 
 def proc_callback(handle、args = None):
 ret = d.end(handle)
 
 d = Delegate()
 d.init(2)#ワーカー数
 
 handle = d.begin(proc、 '12345'、proc_callback、 'test ')
 sys.stdin.readline()
 
 d.free()
1
ideawu