PythonのDjangoのコルーチンエラー、プロセスプール、スレッドプールと非同期呼び出し、コールバックメカニズム

問題のI.説明

Djangoのビュー関数に、導入  geventのモジュール

輸入gevent
 から gevent 輸入サル; monkey.patch_all()
 から gevent.poolのインポートプール

 

Djangoのエラーを起動します。

MonkeyPatchWarning:メインのネイティブスレッドの外に猿が、パッチ適用。一部のAPIはなりません利用できます。KeyError例外がシャットダウン時に印刷することを期待しています。
  gevent 輸入サル; monkey.patch_all()
MonkeyPatchWarning:モンキーは -patching ないメインスレッド上で、。threading.main_thread()がハングアップします)(参加からgreenlet
   から gevent 輸入サル; monkey.patch_all()

 

その理由は、このラインの実装  monkey.patch_all()  エラー時にコード。

 

Djangoはコルーチンを使用することはできませんので、私は非同期実行を使用する必要があることを、どのようにしますか?

下記を参照してください。

 

第二に、プロセス・プール、スレッドプールと非同期呼び出し、コールバックメカニズム

プロセス・プール、スレッドプールの使用事例

ほぼ同じプロセスプールとスレッドプールの使用は、ちょうど〜異なるモジュールを呼び出します!

concurrent.futures インポート ProcessPoolExecutor   #のプロセス電池モジュール
からの concurrent.futures インポート ThreadPoolExecutor   #のスレッドプールのモジュール
をインポートし、OS、時間、ランダム

  例のプロセスプール、スレッドプールのモジュールがちょうどにそれを変更され、次の
DEF の話(名):
     印刷' 名前:S%S%PIS RUN '(名前、os.getpid()))
    time.sleep(random.randint( 1 ,. 3。 ))

IF  __name__ == ' __main__ ' 
    プール(4)= ProcessPoolExecutor   スレッドプールのサイズを設定し、デフォルトでは、CPUコアの数に等しいです。
    以下のために I におけるレンジ(10 ):
        pool.submit(トーク、プロセスS%%I)非同期(だけ待たずに実行するスレッドを提出)提出

    #のプロセスセル入口2は、の効果に提出することはできません。アクション1: jion待っているプロセスがすべて終了実行中のプールに相当します 
    pool.shutdown(待機= TRUE)  
     印刷主要プロセスを

 

非同期呼び出しおよび同期呼び出し

concurrent.futuresモジュールは非常にカプセル化された非同期呼び出しインターフェースを提供 
ThreadPoolExecutorを非同期コール提供するスレッドプール 
ProcessPoolExecutorを:プロセスプールは、非同期呼び出しを提供します

 

同期呼び出し

concurrent.futures インポート ProcessPoolExecutor   #のプロセスプールのモジュール
をインポートし、OS、時間、ランダム


1は、同期呼び出し:シリアル実行にタスクが結果を得るために、その場で待機して終了し、その後、次のコード行され、完全なタスク、(プログラムのリードを提出します)
DEF トーク(名):
     印刷' 名:S%S%PIS RUN '(名前、os.getpid()))
    time.sleep(random.randint( 1 ,. 3 ))

IF  __name__ == ' __main__ ' 
    プール = ProcessPoolExecutor(4。 のための I におけるレンジ(10 ):
        pool.submit(トーク、"プロセスS%"%のI).Result()  シリアル参加する同等ディオール、結果(で同期)、

    pool.shutdown(待機 = TRUE)
     印刷" メインプロセスを"

 

非同期呼び出し

concurrent.futures インポート ProcessPoolExecutor   进程池模块
輸入OS、時間、ランダム

デフ話(名):
     印刷' 名:%sのPIS%sの実行'(名前、os.getpid()))
    ランダムtime.sleep( .randint( 1、3 ))

なら __name__ == ' __main__ ' 
    プール = ProcessPoolExecutor(4 のための I における範囲(10 ):
        pool.submit(トーク、' 进程%S '%I)  非同期呼び出し、待つ必要はありません

    pool.shutdownを(待機 = TRUE)
     印刷主要プロセス

 

コールバックメカニズム

各プロセスまたはスレッドプールのスレッドプールやタスクが実装プロセスやスレッドを終了したときに自動的にトリガ機能のためのプロセスを結合し、パラメータとして、タスクの戻り値を受け取ることができ、コールバック関数が呼び出されます

Parse_page GET将来の目標OBJで、obj.resultで結果を取得するには()を必要とする 
(ここでは非同期と呼ばれる).add_done_callback(メソッド)p.submit

 

ケース:ダウンロード解析するWebページ

インポートのインポート要求
 から concurrent.futuresはインポート ThreadPoolExecutor   #のスレッドプールのモジュールを

DEF :(URL)をGET
     印刷' GET用S%'URL)
    レスポンス = requests.get(URL)  ダウンロードページ 
    time.sleep(3)  アナログネットワーク遅延
    リターン { ' URL ':URL、' コンテンツ':response.text}   #1 ページアドレスとページコンテンツ

DEF 構文解析(RES):
    RES = res.result()  !RESを取る[結果]コールバックパラメータが必要な
    印刷を' %S%S解像度IS '%(RES [ ' URL ' ]、lenは(RES [ ' コンテンツ' ])))

IF  __name__ == ' __main__ ' 
    のURLの = {
         ' http://www.baidu.com ' ' http://www.360.com ' ' http://www.iqiyi.com ' 
    } 

    プール = ThreadPoolExecutor(2 のための I のURL :
        pool.submit(GET、I).add_done_callback(パース)   [コールバック]機能と、スレッドを実行した後

 

 

この記事の参照リンク:

https://blog.csdn.net/weixin_42329277/article/details/80741589

 

おすすめ

転載: www.cnblogs.com/xiao987334176/p/11089601.html