問題の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