プログラムを選択し、[+コールバックイベントループ]

また、私は、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' 
    ループ()

おすすめ

転載: www.cnblogs.com/z-qinfeng/p/12078683.html