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)

gevent模块学习(四)的更多相关文章

  1. Python3 学习第十一弹: 模块学习四之sys库

    sys模块 提供一些与python解释器关系紧密的变量和函数 1> argv 命令行参数 通过命令行可以向python传输参数 2> exit([arg]) 程序退出,可以返回给命令行一个 ...

  2. gevent模块学习(三)

    3. Group类,常用于不限制数量的管理异步任务的分组且可搜集运行结果 g = gevent.pool.Group(*args) -> Group 说明: 创建一个组对象,其实就是一个不限gr ...

  3. gevent模块学习(二)

    2. Queue类,常用用于Greenlet之间的异步共享 q = gevent.queue.Queue(maxsize=None, items=None) -> Queue 说明: 创建一个指 ...

  4. gevent模块学习(一)

    1.Event类,事件主要用于Greenlet之间的异步通信 e = gevent.event.Event() -> Event 说明: 创建一个信号对象 e.set() -> None ...

  5. 爬虫入门之Requests模块学习(四)

    1 Requests模块解析 Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用 Requests 继承了urllib2的所有特性.Requests支持HTTP连接保 ...

  6. python模块学习(四)

    re模块 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C ...

  7. nodejs的mysql模块学习(四)断开数据库连接

    断开连接有两种方式 end()函数 在这种情况下 所有先前排队的查询 仍然可以继续继续发送到服务器,但是如果在执行到断开连接的命令之前发生了致命的错误,那么end()将不会被执行 connection ...

  8. Python之路(第四十七篇) 协程:greenlet模块\gevent模块\asyncio模块

    一.协程介绍 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 协程相比于线程,最大的区别在于 ...

  9. Python学习 :常用模块(四)----- 配置文档

    常用模块(四) 八.configparser 模块 官方介绍:A configuration file consists of sections, lead by a "[section]& ...

随机推荐

  1. Java并发包1--线程的状态及常用方法

    一.线程主要有以下几种状态: new(新建):线程刚刚被创建 runnable(就绪):新建的线程执行start方法进入就绪状态等待系统调度分配CPU,被分配了之后就进入运行中状态 blocked(阻 ...

  2. linux中的strings命令

     strings - print the strings of printable characters in files.            意思是, 打印文件中可打印的字符.  我来补充一下吧 ...

  3. C#基本方法(瞎写写)

    public static IEnumerable<T> GetAll<T>() where T : new() { using (var conn = new Profile ...

  4. html禁止页面滚动

    <div @touchmove.prevent></div> @touchmove.prevent   //加到标签上禁止滚动

  5. js时间相关

    let date = new Date(); date.getYear(); //获取当前年份(2位) date.getFullYear(); //获取完整的年份(4位) date.getMonth( ...

  6. image management in kubernet

    Image How can I edit an existing docker image metadata? docker-copyedit Registry Disk kubevirtis a g ...

  7. springboot使用validation 插件做数据校验

    不多说废话. 首先,我们需要在入参实体对象中,使用注解,控制 @Datapublic class UpdateShufflingRequest { private String shuffling_l ...

  8. Unity3D里怎样隐藏物体

    方法很多: 1.改position,移到视野外,推荐,最节省 2.gameObject.SetActive (false); //要提前引用,要不你就改不回来了... 3.renderer.enabl ...

  9. selenium python 中浏览器操作

    1.启用浏览器 browser = webdriver.Chrome()               谷歌浏览器 browser = webdriver.Firefox()              ...

  10. Java 连接 MySQL 数据库

    最近想学习一下 Java 连接 MySQL 数据库,于是有了这样的一些问题&解决办法. 首先是解决 JDBC(Java Data Base Connectivity)驱动问题,因为默认安装的J ...