1. 程式人生 > 其它 >面試彙總7.8

面試彙總7.8

協程

協程: 協作式,-----非搶佔式程式

A----->B----->A----->C

通過A執行執行一段時間,A儲存;切換到B---用B執行,B儲存;等等。可以自己控制什麼時候切換。

協程:又稱為微執行緒。英文是:Coroutine

優點:

-協程極高的執行效率。因為子程式不是執行緒切換,而是由程式自身控制,因此沒有切換執行緒的開銷,和多執行緒比,執行緒數量越多,協程的效能優勢就越明顯。

-不需要多執行緒的鎖機制,因為只有一個執行緒,也不存在同時寫變數衝突,在協程中控制共享資源不加鎖,只需要判斷狀態就好了,所以執行效率比執行緒高很多。

因為協程本質是一個執行緒執行

,那麼怎麼利用多核CPU呢。最簡單的方法是多程序+協程。既充分利用多核,又充分發揮協程的效率,可以獲得極高的效能

協程例子如下:

簡單例子:例1:

import time
import queue

def consumer(name):

print("--->ready to eat baozi...")
while True:
new_baozi = yield
print("[%s] is eating baozi %s" % (name,new_baozi))
#time.sleep(1)

def producer():

r = con.__next__()#執行生產器
r = con2.__next__()#執行生成器

n = 0
while 1:
time.sleep(1)
print("\033[32;1m[producer]\033[0m is making baozi %s and %s" %(n,n+1) )
con.send(n)#發訊息並執行生成器,相當於new_baozi = n
con2.send(n+1)#同上
n +=2


if __name__ == '__main__':

con = consumer("c1")#生成器
con2 = consumer("c2")#生成器
producer()

結果是:

--->ready to eat baozi...
--->ready to eat baozi...
[producer] is making baozi 0 and 1
[c1] is eating baozi 0
[c2] is eating baozi 1
[producer] is making baozi 2 and 3
[c1] is eating baozi 2
[c2] is eating baozi 3

.............

會一直這樣執行下去

greenlet協程模組

greenlet 是一個用C實現的協程模組,相比python自帶的yield,它可以在任意含義之間隨意切換,而不需要把這個函式先宣告為生成器。

from greenlet import greenlet

def test1():
print(12)
gr2.switch()
print(34)
def test2():
print(56)
gr1.switch()
print(78)
gr1.switch()

gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr2.switch()#====>從gr2開始執行

結果是:

56

12

78

34

gevent 模組

gevent 模組會自動切換不用自己每次都設定切換

import gevent
import requests,time
start=time.time()
def f(url):
print('GET: %s' % url)#===》url 是網址
resp =requests.get(url)#此處獲得了url,已經爬下來了
data = resp.text #列印爬下的內容
print('%d bytes received from %s.' % (len(data), url))


gevent.joinall([
gevent.spawn(f, 'https://www.python.org/'),
gevent.spawn(f, 'https://www.yahoo.com/'),
gevent.spawn(f, 'https://www.baidu.com/'),
gevent.spawn(f, 'https://www.sina.com.cn/'),
gevent.spawn(f, 'http://www.xiaohuar.com/hua/'),
])


print("cost time:",time.time()-start)