gevent模塊學習(四)


gevent.spawn會對傳入的子任務集合進行調度,gevent.joinall 方法會阻塞當前程序,除非所有的greenlet都執行完畢,才會退出程序
公有方法
gevent.spawn(cls, *args, **kwargs) 創建一個Greenlet對象,其實調用的是Greenlet.spawn(需要from gevent import Greenlet),返回greenlet對象
gevent.joinall(greenlets, timeout=None, raise_error=False, count=None) 等待所有greenlets全部執行完畢, greenlets為序列,timeout為超時計時器對象,返回執行完畢未出錯的的greenlet序列
greenlet
g.join() 等待此協程執行完畢后
 
注意: 多條gevent.spawn(cls, *args, **kwargs).join()語句即使為阻塞調用也不會協程式調用,因為生成的Greenlet對象執行完就消失,所有要實現協程式調用可通過gevent.joinall(greenlets, timeout=None, raise_error=False, count=None)或是賦值到一變量后再對此對象調用.join(),其中一個特殊的方式就是for循環調用將隱式的賦值對象調用,會自動變為協程式運行.
# coding:utf-8

import gevent
import random


def task(pid):
    gevent.sleep(random.randint(0,2)*0.001)
    print('task %s done'%pid)


def synchronous():
    for i in range(1, 10):
        task(i)


def asynchronous():

    threads = [gevent.spawn(task, i) for i in xrange(10)]
    # print(threads)
    # spawn將task函數封裝到greenlet內部線程
    gevent.joinall(threads) # gevent.joinall 阻塞當前流程 並執行所有給定的greenlet 執行完繼續往下走


print('Synchronous')
synchronous()

print('Asynchronous')
asynchronous()
# coding:utf-8
import gevent.monkey
gevent.monkey.patch_socket()
import gevent
import urllib2
import json


def fetch(pid):
    response = urllib2.urlopen('http://www.baidu.com')
    result = response.read()
    print('Process %s: %s' % (pid, result))



def synchronous():
    for i in range(1, 10):
        fetch(i)

def asynchronous():
    threads = []
    for i in range(1,10):
        threads.append(gevent.spawn(fetch, i) for i in xrange(10))  # spawn將task函數封裝到greenlet內部線程
    gevent.joinall(threads)


print('Synchronous')
synchronous()

print('Asynchronous')
asynchronous()

 

#coding:utf-8
import gevent
import gevent.monkey

gevent.monkey.patch_all()

# spawn_later函數可接收周期時間及運行函數。

INTERVAL = 10

def schedule(delay, func, *args, **kw_args):
    gevent.spawn_later(1, func, *args, **kw_args)
    gevent.spawn_later(delay, schedule, delay, func, *args, **kw_args)

def test1():
    print "func test1"

def test2():
    print "func test2"

def test3():
    print "test3"

schedule(1,test1)
schedule(2,test2)
schedule(3,test3)

while 1:
    gevent.sleep(1)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM