欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python greenlet和gevent使用代碼示例解析

 更新時間:2020年04月01日 14:26:31   作者:臨淵  
這篇文章主要介紹了Python greenlet和gevent使用代碼示例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

greenlet示例

greenlet微線程,允許在線程中手動切換

示例1,線程切換

from greenlet import greenlet

def test1(x,y):
  z = gr2.switch(x+y)
  print(z)

def test2(u):
  print(u)
  gr1.switch(42)

gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch("hello",'world')

gr1和gr2是兩個greenlet線程,使用gr1.switch(..)啟動gr1,gr1執(zhí)行test1,切換到gr2,gr2執(zhí)行test2打印helloworld,然后切換回gr1,z獲取

到返回值42,并打印.

執(zhí)行順序為:

gr1.switch("hello",'world') -> test1('hello','world')->

gr2.switch('helloword')->test2('helloworld')->print('helloworld')

->gr1.switch(42)->z=42->print(42)

打印結(jié)果:

helloworld
42

示例2

from greenlet import greenlet

def eat(name):
  print('%s eat 1' %name)
  g2.switch('egon')
  print('%s eat 2' %name)
  g2.switch()
def play(name):
  print('%s play 1' %name)
  g1.switch()
  print('%s play 2' %name)

g1=greenlet(eat)
g2=greenlet(play)

g1.switch('egon')#可以在第一次switch時傳入?yún)?shù),以后都不需要

g1.switch('egon')#可以在第一次switch時傳入?yún)?shù),以后都不需要

gevent

gevent基于greenlet,遇到IO操作自動切換,IO操作比如網(wǎng)絡(luò)請求,或使用 gevent.sleep(0)強制切換.

示例1

import gevent

def func1():
  print("start func1")
  gevent.sleep(1)
  print("end func1")

def func2():
   print("start func2")
  gevent.sleep(1)
  print("end func2")

gevent.joinall(
  [
    gevent.spawn(func1),
    gevent.spawn(func2)
  ]
)

執(zhí)行結(jié)果:

start func1
start func2
end func1
end func2
``

示例2: gevent使用monkey對所有系統(tǒng)自帶的IO操作打patch

```python
from gevent import monkey;monkey.patch_all()

import gevent
import time
def eat():
  print('eat food 1')
  time.sleep(2) # 會自動的跳轉(zhuǎn)到play
  print('eat food 2')

def play():
  print('play 1')
  time.sleep(1) # 會自動的跳轉(zhuǎn)到eat
  print('play 2')

g1=gevent.spawn(eat)
g2=gevent.spawn(play)
gevent.joinall([g1,g2])
print('end')

執(zhí)行結(jié)果

eat food 1
play 1
play 2
eat food 2
end

示例3,發(fā)送請求

from gevent import monkey; monkey.patch_all()
import gevent
import requests

def f(url):
  print('GET: %s' % url)
  resp = requests.get(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://github.com/'),
    gevent.spawn(f, 'https://github.com/'),
    gevent.spawn(f, 'https://github.com/'),
    gevent.spawn(f, 'https://github.com/'),
    gevent.spawn(f, 'https://github.com/'),
])

示例4:使用gevent的socket替代系統(tǒng)的socket

import gevent
from gevent import socket

urls = ['www.baidu.com', 'www.163.com', 'www.qq.com']
jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls]
gevent.joinall(jobs, timeout=2)

print([job.value for job in jobs])
或使用patch_socket()
from gevent import monkey; monkey.patch_socket()
import gevent

def f(n):
  for i in range(n):
    print(gevent.getcurrent(), i)
    gevent.sleep(0) # 不加的話不會交替執(zhí)行
g1 = gevent.spawn(f, 5)
g2 = gevent.spawn(f, 5)
g3 = gevent.spawn(f, 5)
g1.join()
g2.join()
g3.join()

示例5:隊列中使用gevent.sleet(0)強制切換到其他線程

import gevent
from gevent.queue import Queue


def func():
  for i in range(10):
    print("int the func")
    q.put(f"test{i}")
    gevent.sleep(0)

def func2():
  for i in range(10):
    print("int the func2")
    res = q.get()
    print("--->",res)

q = Queue()
gevent.joinall(
  [
    gevent.spawn(func2),
    gevent.spawn(func),
  ]
)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 在Django的模板中使用認證數(shù)據(jù)的方法

    在Django的模板中使用認證數(shù)據(jù)的方法

    這篇文章主要介紹了在Django的模板中使用認證數(shù)據(jù)的方法,Django是最具人氣的Python web開發(fā)框架,需要的朋友可以參考下
    2015-07-07
  • 快速進修Python指南之網(wǎng)絡(luò)編程及并發(fā)編程

    快速進修Python指南之網(wǎng)絡(luò)編程及并發(fā)編程

    這篇文章主要為大家介紹了Java開發(fā)者如何快速進修Python指南之網(wǎng)絡(luò)編程及并發(fā)編程實例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Python PIL實現(xiàn)GIF壓縮工具

    Python PIL實現(xiàn)GIF壓縮工具

    本文將結(jié)合wxPython的GUI框架和PIL(Python Imaging Library)的圖像處理能力編寫一個GIF壓縮工具,并提供了兩種壓縮方式,感興趣的小伙伴可以了解下
    2024-10-10
  • Django web自定義通用權(quán)限控制實現(xiàn)方法

    Django web自定義通用權(quán)限控制實現(xiàn)方法

    這篇文章主要介紹了Django web自定義通用權(quán)限控制實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Python TCP全連接攻擊中SockStress全連接攻擊詳解

    Python TCP全連接攻擊中SockStress全連接攻擊詳解

    Sock Stress 全連接攻擊屬于TCP全連接攻擊,因為需要建立一次完整的TCP三次握手,該攻擊的關(guān)鍵點就在于,攻擊主機將windows窗口緩沖設(shè)置為0,實現(xiàn)的拒絕服務(wù)
    2022-10-10
  • pytest之a(chǎn)ssert斷言的具體使用

    pytest之a(chǎn)ssert斷言的具體使用

    這篇文章主要介紹了pytest之a(chǎn)ssert斷言的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Django中間件攔截未登錄url實例詳解

    Django中間件攔截未登錄url實例詳解

    在本篇文章里小編給各位整理了關(guān)于Django中間件攔截未登錄url的實例內(nèi)容以及相關(guān)知識點,有需要的朋友們可以學(xué)習(xí)下。
    2019-09-09
  • python異常的傳遞知識點總結(jié)

    python異常的傳遞知識點總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于python異常的傳遞知識點總結(jié),有興趣的朋友們可以學(xué)習(xí)下。
    2021-06-06
  • python為什么要安裝到c盤

    python為什么要安裝到c盤

    在本篇文章里小編給大家整理的是一篇關(guān)于python安裝到c盤的原因的文章,有需要的朋友們可以學(xué)習(xí)參考下。
    2020-07-07
  • python基礎(chǔ)學(xué)習(xí)之遞歸函數(shù)知識總結(jié)

    python基礎(chǔ)學(xué)習(xí)之遞歸函數(shù)知識總結(jié)

    在函數(shù)中調(diào)用函數(shù)自身,我們把這樣的函數(shù)叫做遞歸函數(shù), 遞歸函數(shù)就是循環(huán)的調(diào)用,類似于俄羅斯套娃,本文給各位小伙伴詳細介紹了python遞歸函數(shù),需要的朋友可以參考下
    2021-05-05

最新評論