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つのスレッドプロセスをスライスし、スレッドが元の行ごとに実行するのではなく、コードブロック間で往復切替実行されるようにします.
注意:単純な協力は役に立たない
協程の存在意義協程+IOに遭遇すると切り替え=>牛がpip 3 install geventを追い詰めた
まとめ:1.協程とは何ですか.協程は「マイクロスレッド」とも呼ばれ、開発者がスレッド実行プロセスを制御し、あるセグメントのコードを実行してから別の関数実行コードに切り替えるように制御する...切り替えます. 2. 協力は同時性を高めることができますか?コラボレーション自体は同時実行できません(パフォーマンスが低下することもあります).コモン+IO切替性能向上. 3. プロセス、スレッド、コヒーレンスの違い? 4. 単一スレッドは同時実行を提供する:-コモン+IO切替:gevent-イベントサイクルに基づく非同期非ブロックフレームワーク:Twisted手動実装コモン:yieldキーワードジェネレータ
その他:
重点まとめ:1.プロセス、スレッド、コンシステントの違い?******2.書き込みコード:gevent*****
3.書き込みコード:twisted*****
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.非同期/同期ブロック/非ブロック
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.非同期/同期ブロック/非ブロック