ホームページ >バックエンド開発 >Python チュートリアル >Python の非同期ネットワーク探索

Python の非同期ネットワーク探索

巴扎黑
巴扎黑オリジナル
2016-12-09 13:35:201552ブラウズ

非同期ネットワークはネットワークサーバーの接続速度を大幅に向上させると言われているので、非同期ネットワークを学び理解するためのトピックを書く予定です。Pythonには非常に有名な非同期Lib:Twistedがあるので、Pythonを使用してそれを完成させます。
OK、最初に Python ソケットのサーバー セグメントを書き込み、3 つのポート 10000、10001、10002 を開きます。krondo の例では、各サーバーはポートにバインドされており、テスト時には 3 つのシェルを開いて個別に実行する必要があります。面倒な場合は、これらのサービスを 3 つのスレッドで実行してください。

import optparse
import os
import socket
import time
from threading import Thread
import StringIO
 
txt = '''1111
2222
3333
4444
'''
 
def server(listen_socket):
    while True:
        buf = StringIO.StringIO(txt)
        sock, addr = listen_socket.accept()
        print 'Somebody at %s wants poetry!' % (addr,)
        while True:
                try:
                    line = buf.readline().strip()
                    if not line:
                        sock.close()
                        break
                    sock.sendall(line)  # this is a blocking call
                    print 'send bytes to client:%s' % line
                    #sock.close()
                except socket.error:
                    sock.close()
                    break
                time.sleep(1)  #server和client连接后,server会故意每发送一个单词后等待一秒钟后再发送另一个单词
 
 
def main():
    ports = [10000, 10001, 10002]
    for port in ports:
        listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        addres = (str('127.0.0.1'), port)
        listen_socket.bind(addres)
        listen_socket.listen(5)
        print "start listen at:%s" % (port,)
        worker = Thread(target = server, args = [listen_socket])
        worker.setDaemon(True)
        worker.start()
 
 
if __name__ == '__main__':
    main()
    while True:
        time.sleep(0.1) #如果不sleep的话,CPU会被Python完全占用了
        pass

以下は、非同期ネットワークがない場合、3 つのポートでサーバーに接続します。 、コードは次のとおりです:

import socket
 
 
if __name__ == '__main__':
    ports = [10000, 10001, 10002]
    for port in ports:
        address = (str('127.0.0.1'), port)
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect(address)
        poem = ''
        while True:
            data = sock.recv(4)
            if not data:
                sock.close()
                break
            poem += data
        print poem

その結果、読み取りタスクを完了するのにかかる時間はわずか 4 秒です。効率は先ほどの同期ソケットの 3 倍です。クライアントの非同期変換には主に 2 つのポイントがあります:


同期モードでは、クライアントはソケットを個別に作成しますが、非同期モードでは、クライアントは最初からすべてのソケットを作成します。

「sock.setblocking(0)」を通じてソケットを非同期モードに設定します。

Unix システムの選択された 2 つを通じて読み取り可能な IO を返します

最もコアなものは 26 行目と 29 行目です。特に、29 行目の選択操作は、読み取られるソケットのリストを返します。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:Python デコレータ次の記事:Python デコレータ