また、私は、Javaよりも書き込みに悲しい感じ.....
「」」 を選択し、投票のepoll 注:ファイルディスクリプタは、シーンを見て必要とし、必ずしもより良い選択の性能よりではありません 1 。並行性の高いシナリオでは、接続の活動は、このようなウェブアプリケーションとして、epollをよりよい選択よりも、非常に高いではありません 2 ゲームなど、同時では高くはないが、非常にアクティブな接続のシーンの下で、より良いのepollより選択 モードをプログラミング:SELECT + +サイクルイベントコールバック 「」 " インポートソケット urllib.parseからインポートurlparse #DefaultSelector、パイソンベースのアプリケーションを使用しているときインターネット自動選択モードまたはセレクトモードのepoll #DefaultSelector選択し、ファイルディスクリプタがカプセル化されている セレクタからインポートDefaultSelector、EVENT_READ、EVENT_WRITE セレクタ = DefaultSelector() (窓がないサポートのepollん)要求は選択を使用して完成された#HTTP のURL = [「のhttp:// www.baidu.com "] ストップ= Falseの#は、グローバル変数、制御ループが終了、または与えられているウィンドウの環境設定 クラス:のためのFetcherの DEF GET_URL(セルフ、URL): 「」「HTTPリクエストは、ソケットによって完成される」「」 self.url = URL URL = urlparse (URL) self.host = url.netloc self.path = url.path IF self.path == "" : self.path = "/" #ソケット接続確立 self.client = socket.socket(はsocket.AF_INET、ソケットを.SOCK_STREAM) (false)をself.client.setblocking非ブロッキングモード#の配置 self.data "= B"を 代表#バイト 試して: self.client.connect((self.host、 80 )) BlockingIOError AS Eを除く: パス #レジスタ、モニターの書き込みイベントコールバックの selector.register(self.client.fileno()、EVENT_WRITE、 self.writable ) DEF書き込み可能(セルフ、KEY): '' '書き込みコールバック' '' selector.unregister(key.fd) self.client.send( 「{} GET HTTP / 1.1 \ R&LT \ NHOst:{} \ R&LT \ nConnection - "フォーマット(self.path、self.host).encode使用閉じる\ R \ N- \ R \ N(" UTF-8 " )) #登録、リードリスナーのイベントコールバック selector.register(self.client.fileno() 、EVENT_READ、self.readable) DEF読めるの(自己、キー): DSelf.client.recv =(1024 ) IF D: self.data + = D 他:#データが読み込まれた selector.unregister(key.fd) データ = self.data.decode( "UTF-8" ) html_data =データ.split( '\ R&LT \ N- \ R&LT \ N-')[1 ] 印刷(html_data) self.client.close() のURLの後に処理urls.remove(self.url)#、URLは、URLから削除されます加えて、 IF データがない場合は#のURLを、あなたはイベントループサイクルを停止することができます:いないのURL 、株式会社無料STOP参加 STOP = 真 DEFループを(): 「」 ' イベントループ、ソケット停止要求のステータス、および対応するコールバック関数を呼び出します :リターン: 「」 ' 。#1 選択レジスタモードは、自分自身をサポートしていませんが、DefaultSelectorがカプセル化されて選択するように。 # 2 以降の状態変化がソケットをコールバック。完了していないオペレーティングシステムにより、プログラムによって行われている 間:ないSTOP READY = selector.select() のために:READYにマスク、キーを call_back = key.data call_back(キー) IF __name__ == '__main__' : フェッチャ = ()のためのフェッ fetcher.get_url( 'http://www.baidu.com' ) ループ()