python学習-協程

13975 ワード

ステージ内容のレビュー:
1. socket 2. ブラウザ/爬虫類などはすべてsocketクライアント3である.いったい誰が痛いの?-クライアントがサービス側に接続を開始するとき、サービス側が痛い-クライアントがサービス側にデータを送信とき、クライアントが痛い(クライアントのために作成するsocketオブジェクト)conn,addr=server.accept()   conn.recv() 4. 同時性を向上させたいなら?-マルチプロセス:計算-マルチスレッド:IO
本節の内容:1.IO多重化2.IO多重+socketに基づく同時要求(スレッド100個の要求)3を実現する.協程内容詳細:1.IO多重IO多重化:複数のsocketが変化したか(接続に成功したか/データを取得したか)を検出する(読み取り/書き込み可能)
2.IO多重化+socketに基づく同時要求(スレッド100個の要求)IO多重化socket非ブロックイベントループに基づく非同期非ブロックフレームワーク:lzl非ブロック:非同期を待たない:ある人物を実行した後、自動的に私が彼に与えた関数数を呼び出す.Pythonにおけるオープンソースのイベントループに基づく非同期非ブロックフレームワークTwisted(単一スレッド完了同時)のまとめ:1.ソケットのデフォルトはブロックされていますか?閉塞はどこに現れますか?はい、content、recv 2.どのようにsocketプログラミングをブロックしませんか?    socket.setblocking(false)   3. IO多重化作用?複数のsocketが変化しているかどうかを検出します.オペレーティングシステムはsocketが変化したかどうかを検出し、3つのモードがある:select:最大1024個のsocket;ループ検出.Poll:リスニングsocket個数を制限しない;ループデ検出(水平トリガ).epoll:傍受socket個数を制限しない;コールバック方式(エッジトリガ).Pythonモジュール:select.select       select.epoll   4. コンカレント方式の向上:-マルチプロセス-マルチスレッド-非同期非ブロックモジュール(Twisted)scrapyフレームワーク(単一スレッドでコンカレントを完了)5.非同期非ブロックとは?-ブロックなし、待機なし.たとえば、socketを作成してアドレスをconnectしたり、受信データrecvを取得したりすると、デフォルトでは(接続に成功したり、データを受信したり)待ってから、後続の操作が実行されます.setblocking(False)を設定すると、以上の2つのプロシージャは待機しませんが、ブロックキングIOErrorのエラーが表示されます.キャプチャすればいいです.-非同期、通知、実行が完了した後にコールバック関数を自動的に実行するか、特定の操作(通知)を自動的に実行します.例えば爬虫類の中である住所baidu.comは、要求実行が完了した後にコールバック関数を自己実行する要求を送信する.
  6. 同期ブロックとは?-ブロック:等-同期:key_を順番に逐次実行list = ['alex','db','sb']     for item in key_list:       ret = requests.get('https://www.baidu.com/s?wd=%s' %item)       print(ret.text)
  7. 概念(パッケージ化された方法で複数のデータを転送する)の前:#あなたが書いたコード:7000 w v=[[11,22],#それぞれにappendメソッド[22,33],#それぞれにappendメソッド[33,44],#それぞれにappendメソッドがある]
#王思聡for item in v:print(item.append)の後:class Foo(object):def_init__(self,data,girl):         self.row = data         self.girl = girl
      def append(self,item):         self.row.append(item)
v=[Foo([11,22],'雪梨'),#それぞれにappendメソッドFoo([22,33],'氷砂糖'),#それぞれにappendメソッドFoo([33,44],'糖宝'),#それぞれにappendメソッドがある]
    for item in v:       print(item.append)       item.girl 3. 協程概念:プロセス、オペレーティングシステムに存在する;スレッド、オペレーティングシステムに存在します.協程は、プログラマーが創造した真実ではないものです.協程:マイクロスレッドで、1つのスレッドプロセスをスライスし、スレッドが元の行ごとに実行するのではなく、コードブロック間で往復切替実行されるようにします.
import greenlet

def f1():
    print(11)
    gr2.switch()
    print(22)
    gr2.switch()

def f2():
    print(33)
    gr1.switch()
    print(44)

#   gr1
gr1 = greenlet.greenlet(f1)
#   gr2
gr2 = greenlet.greenlet(f2)

gr1.switch()

 
注意:単純な協力は役に立たない
def f1():
    print(11)
    print(33)

def f2():
    print(22)
    print(44)
f1()
f2()

協程の存在意義協程+IOに遭遇すると切り替え=>牛がpip 3 install geventを追い詰めた
from gevent import monkey
monkey.patch_all() #  IO greenlet switch 
import requests
import gevent

def get_page1(url):
    ret = requests.get(url)
    print(url,ret.content)

def get_page2(url):
    ret = requests.get(url)
    print(url,ret.content)

def get_page3(url):
    ret = requests.get(url)
    print(url,ret.content)

gevent.joinall([
gevent.spawn(get_page1, 'https://www.python.org/'), #  1
gevent.spawn(get_page2, 'https://www.yahoo.com/'), #  2
gevent.spawn(get_page3, 'https://github.com/'), #  3
])

 
まとめ:1.協程とは何ですか.協程は「マイクロスレッド」とも呼ばれ、開発者がスレッド実行プロセスを制御し、あるセグメントのコードを実行してから別の関数実行コードに切り替えるように制御する...切り替えます.  2. 協力は同時性を高めることができますか?コラボレーション自体は同時実行できません(パフォーマンスが低下することもあります).コモン+IO切替性能向上.  3. プロセス、スレッド、コヒーレンスの違い?  4. 単一スレッドは同時実行を提供する:-コモン+IO切替:gevent-イベントサイクルに基づく非同期非ブロックフレームワーク:Twisted手動実装コモン:yieldキーワードジェネレータ
def f1():
    print(11)
    yield
    print(22)
    yield
    print(33)

def f2():
    print(55)
    yield
    print(66)
    yield
    print(77)

v1 = f1()
v2 = f2()
next(v1) # v1.send(None)
next(v2) # v1.send(None)
next(v1) # v1.send(None)
next(v2) # v1.send(None)
next(v1) # v1.send(None)
next(v2) # v1.send(None)

 
その他:
def f1():
    print(11)
    x1 = yield 1
    print(x1,22)
    x2 = yield 2
    print(33)

def f2():
    print(55)
    yield
    print(66)
    yield
    print(77)

v1 = f1()
v2 = f2()
ret = v1.send(None)
print(ret)
r2 = v1.send(999)
print(r2)

 
重点まとめ:1.プロセス、スレッド、コンシステントの違い?******2.書き込みコード:gevent*****
from gevent import monkey
monkey.patch_all() #  IO greenlet switch 
import requests
import gevent


def get_page1(url):
    ret = requests.get(url)
    print(url,ret.content)

def get_page2(url):
    ret = requests.get(url)
    print(url,ret.content)

def get_page3(url):
    ret = requests.get(url)
    print(url,ret.content)

gevent.joinall([
gevent.spawn(get_page1, 'https://www.python.org/'), #  1
gevent.spawn(get_page2, 'https://www.yahoo.com/'), #  2
gevent.spawn(get_page3, 'https://github.com/'), #  3
])

 
3.書き込みコード:twisted*****
from twisted.web.client import getPage, defer
from twisted.internet import reactor

def all_done(arg):
    reactor.stop()

def callback(contents):
    print(contents)

deferred_list = []
url_list = ['http://www.bing.com', 'http://www.baidu.com', ]
for url in url_list:
    deferred = getPage(bytes(url, encoding='utf8'))
    deferred.addCallback(callback)
    deferred_list.append(deferred)

dlist = defer.DeferredList(deferred_list)
dlist.addBoth(all_done)

reactor.run()

 
4.非同期非ブロック5.IO多重化:すべてのIOリクエストのステータスをリスニングできます.-socket I,input o,outputの3つのモード:-select-poll-epoll
2週間のまとめ:ネットワークプログラミング:1.ネットワークベース-NIC-IP-...    2. OSI 7層3.3回握手4回手を振る.BSとCSアーキテクチャ?    5. socket基本コード6.粘着(コードを見ない)が現れる原因、解決方法7.ブレークポイント続伝8.プロトコルカスタムプロトコル:{'code':10001,data:{...}}Httpプロトコル:GET/s?wd=alex HTTP/1.0\rhost:www.baidu.com\r\r     9. オブジェクト向け+高度なジョブ:反射/オブジェクト向け同時プログラミング:1.プロセス、スレッド、コヒーレンスの違い?    2. スレッド-基本的な書き方-インスタンス化-継承-ロック-RLock...-スレッドプール3.プロセス-基本的な書き方-インスタンス化-継承-ロック-RLock...-スレッドプール-プロセスデータ共有4.協程-協程-協程+IO:gevent 5.IO多重化6.非同期/同期ブロック/非ブロック