Python之協程(二十九)

2022-09-22 19:00:47 字數 3254 閱讀 8372

cpu所執行。由於在python的語言中,不管啟動多少個執行緒,只能輪流被一個cpu所排程和執行,

不能像其他語言一樣啟動多個執行緒被n個cpu執行,這就是python執行緒的缺陷,基於這個缺陷,也

就有了協程,在python的語言中,執行緒的切換是由cpu來完成,而協程的切換是由python**來

切換的,這樣比起執行緒來說,協程消耗的資源會非常小,它的控制層面完全是在使用者層面控制的,

所以更加靈活。在協程中任務切換的原則是一旦遇到任務堵塞,就立刻切換,毫不猶豫,這樣保證

任務一直能夠執行的,除非假設一種情況就是所有的任務都堵塞,無法執行,這種情況也是存在,

但是基本出現的少。在python中,使用協程的庫分別是gevent,asyncio,下面就結合具體的案例來

說明這部分的應用。

在gevent的庫裡面,切換任務使用的是switch,它的優點是規避io的操作,這樣就結合訪問一個

**系統,來看協程的案例應用,假設一個**可以訪問,另外一個不可以訪問,來看應用,案例

**如下:

#

!/usr/bin/env python

#-*-coding:utf-8 -*-

import

gevent

import

time as t

from gevent import

monkey

monkey.patch_all()

import

requests

defget_wuya():

print('

開始訪問無涯課堂')

r=requests.get('

')print

(r.status_code)

print('

訪問無涯課堂結束')

defget_baidu():

print('')

t.sleep(2)

r=requests.get('

')print

(r.status_code)

print('')

g1=gevent.spawn(get_wuya)

g2=gevent.spawn(get_baidu)

g1.join()

g2.join()

遇到任務堵塞就切換,g1.join()是直到g1任務執行完成為止,見執行上面**後,協程的任務切換,見執行結果截圖:

當然有一種更加簡單的方式來處理join,也就是說可以使用列表的方式來進行處理,修改**的**:

#

!/usr/bin/env python

#-*-coding:utf-8 -*-

import

gevent

import

time as t

from gevent import

monkey

monkey.patch_all()

import

requests

defget_wuya():

print('

開始訪問無涯課堂')

r=requests.get('

')print

(r.status_code)

print('

訪問無涯課堂結束')

defget_baidu():

print('')

t.sleep(2)

r=requests.get('

')print

(r.status_code)

print('')

g1=gevent.spawn(get_wuya)

g2=gevent.spawn(get_baidu)

gevent.joinall([g1,g2])

#

!/usr/bin/env python

#-*-coding:utf-8 -*-

import

gevent

import

time as t

from gevent import

monkey

monkey.patch_all()

import

requests

defget_baidu():

print('')

r=requests.get('

')print

(r.status_code)

print('')

gevent_tasks=

for i in range(10):

g1=gevent.spawn(get_baidu)

gevent.joinall(gevent_tasks)

見執行**後,執行的結果截圖:

實現協程的思想來請求兩個頁面,一個堵塞了(可能是超時,可能是未知原因),就立刻切換到另外一個任務中執行,見實現的案例

**:

#

!/usr/bin/env python

#-*-coding:utf-8 -*-

import

gevent

import

time as t

from gevent import

monkey

monkey.patch_all()

import

requests

defget_sina():

r=requests.get('

')print('

',r.status_code)

defget_baidu():

r=requests.get('

')print('

',r.status_code)

gevent_tasks=

for i in range(100):

g1=gevent.spawn(get_baidu)

g2=gevent.spawn(get_sina)

gevent.joinall(gevent_tasks)

任務執行結束,見執行過程的部分切換結果:

二十九 安全字串

string物件可能包含一些敏感資料,比如使用者密碼等,如果允許執行一些不安全或者非託管的 ,這些 就可以掃描程序的地址空間,找到包含敏感資...

c 第二十九天

p143 p151 其他隱式型別轉換 1 陣列轉換成指標,大多數表示式自動轉換成指向陣列首元素的指標。 2 指標的轉換。 3 轉換成布林型別...

省選模擬二十九 題解

t1 考場上只想到了列舉拆三元環,拿到60pts 發現其實有一個性質沒有用到 保證將這 個點移除後,剩餘的圖將不存在環。 假設黑點為沒有被欽...