python中實現併發的手段之 協程

2022-08-31 20:21:16 字數 2500 閱讀 3091

程序 

啟動多個程序 程序之間是由作業系統負責呼叫

執行緒 啟動多個執行緒 真正被cpu執行的最小單位實際是執行緒

開啟乙個執行緒 建立乙個執行緒 暫存器 堆疊

關閉乙個執行緒

協程本質上是乙個執行緒

能夠在多個任務之間切換來節省一些io時間

協程中任務之間的切換也消耗時間,但是開銷要遠遠小於程序執行緒之間的切換

import

time

defconsumer():

while

true:

x = yield

time.sleep(1)

print('

處理了資料 :

',x)

defproducer():

# 建立乙個生成器物件

c =consumer()

# 啟用這個生成器

next(c)

for i in range(10):

time.sleep(1)

print('

生產了資料 :

',i)

c.send(i)

producer()

真正的協程模組就是使用greenlet完成的切換

from greenlet import

greenlet

defeat():

print('

eating start')

g2.switch()

print('

eating end')

g2.switch()

defplay():

print('

playing start')

g1.switch()

print('

playing end')

g1 =greenlet(eat)

g2 =greenlet(play)

g1.switch()

可以看出來,greenlet只能實現兩個**之間的切換,但是我們使用協程的主要原因是在io請求時,達到非阻塞的作用,所以我們需要使用gevent模組來讓**可以遇到阻塞就自由的切換

from gevent import

monkey;monkey.patch_all()

import

time

import

gevent

import

threading

defeat():

print

(threading.current_thread().getname())

print

(threading.current_thread())

print('

eating start')

time.sleep(1)

print('

eating end')

defplay():

print

(threading.current_thread().getname())

print

(threading.current_thread())

print('

playing start')

time.sleep(1)

print('

playing end')

g1 =gevent.spawn(eat)

g2 =gevent.spawn(play)

g1.join()

g2.join()

程序和執行緒的任務切換由作業系統完成

協程任務之間的切換由程式(**)完成,只有遇到協程模組能識別的io操作的時候,程式才會進行任務切換,實現併發的效果

同步 和 非同步

from gevent import

monkey;monkey.patch_all()

import

time

import

gevent

deftask(n):

time.sleep(1)

print

(n)def

sync():

for i in range(10):

task(i)

defasync():

g_lst =

for i in range(10):

g =gevent.spawn(task,i)

gevent.joinall(g_lst)

#for g in g_lst:g.join()

sync()

async()

在高io的時候可以使用 例如爬蟲, 爬蟲需要請求很多url,使用協程可以讓請求同時發出,而不會因為在等待乙個url的請求響應而阻塞程式

不適用於高計算的環境, 因為在計算時cpu是一直工作的, 頻繁的切換執行的程式,會白白增加切換程式的時間,導致計算效率下降

Python反爬手段之User Agent池

user agent即使用者 簡稱ua,它是乙個特殊字串頭,使得伺服器能夠識別客戶使用的作業系統及版本 cpu型別 瀏覽器及版本 瀏覽器渲染引擎 瀏覽器語言 瀏覽器外掛程式等。一些 常常通過判斷ua來給不同的作業系統 不同的瀏覽器傳送不同的頁面,因此可能造成某些頁面無法在某個瀏覽器中正常顯示,但通過...

目前常用的高併發處理手段

最近看了很多高併發的解決方案,高併發並沒有通用的解決方案,也不會有現成的demo或者原始碼可以參考,我在這方面也沒有什麼經驗 但是從我看到很多深度不高的文章來說,可以總結出一些可以真正落地的解決辦法 1.入口流量分發,軟體硬體分發 常見的nginx 負載均衡,lvs虛擬ip流量分發,以及f5硬體負載...

HTML中的Hack手段之條件注釋

通常web的好處就是可以跨平台,但這個世界偏偏有個另類,就是ie瀏覽器。在平常做html設計時,有時需要為ie的表示差異而不得不使用一些hack手段。條件注釋就是這類手段之一。條件注釋是ie瀏覽器的 專利 也就是說我們在html中可以為ie嵌入一段專有標籤片段,來解決ie與其它瀏覽器的表現差異。條件...