zoukankan      html  css  js  c++  java
  • gevent模块学习(二)

    2. Queue类,常用用于Greenlet之间的异步共享
    q = gevent.queue.Queue(maxsize=None, items=None) -> Queue
    说明: 创建一个指定大小包含指定items的队列对象
    q.empty() -> Boolean
    说明: 队列是否为空
    q.full() -> Boolean
    说明: 队列是否已满,如果初始化时maxsize为None时队列永远不会满,除非内存耗尽
    q.get(block=True, timeout=None) -> obj
    说明: 队列尾部弹出并返回末尾元素,block为True如果队列为空会一直等待,否则会抛出gevent.queue.Empty异常
    q.get_nowait() -> obj
    说明: 同q.get(block=False),如果队列为空直接返回gevent.queue.Empty
    q.put(item, block=True, timeout=None) -> None
    说明: 队列头部插入item,如果block为True则等待队列有空间时再插入,如果超出timeout则抛出Timeout异常,否则直接抛出gevent.queue.Full异常
    q.put_nowait(self, item) -> None
    说明: 同q.put(block=False),如果队列满直接返回gevent.queue.Full
    q.qsize() -> int
    说明: 返回队列的元素数
    import gevent
    from gevent.queue import Queue
    
    # 队列是一个排序的数据集合  put和get都有非阻塞模式,put_nowait和get_nowait不会阻塞,在操作不能完成时抛出gevent.queue.Empty或gevent.queue.Full异常
    
    tasks = Queue()
    
    def worker(n):
        while not tasks.empty():
            task = tasks.get()
            print('worker %s got task %s'%(n, task))
            gevent.sleep(0)
    
        print('Quitting time!')
    
    
    def boss():
        for i in xrange(1, 25):
            tasks.put_nowait(i)
    
    gevent.spawn(boss).join()
    
    gevent.joinall([
        gevent.spawn(worker, 'steve'),
        gevent.spawn(worker, 'john'),
        gevent.spawn(worker, 'nancy'),
    ])
    
    # coding:utf-8
    
    import gevent
    from gevent.queue import Queue, Empty, LifoQueue, PriorityQueue
    
    # 先进先出
    # 先进后出
    # 优先级队列
    
    class Job():
        def __init__(self, prority, des):
            self.prority = prority
            self.des = des
    
        def __cmp__(self, other):
            return cmp(self.prority, other.prority)
    
        def __str__(self):
            return 'prority %d des %s'%(self.prority, self.des)
    
    
    q = LifoQueue()
    q.put(Job(3, 'mid job'))
    q.put(Job(10, 'low job'))
    q.put(Job(1, 'important job'))
    while not q.empty():
        job = q.get()
        print(job)
    

     joinableQueue JoinableQueue 比Queue多了task_done() 与join()两个函数,都是专用于全球进行编程的,当然多是生产者消费者问题。 task_done() 是用在get()后,告诉os, 我get完了,join()是说Queue里所有的items都被拿出来搞完了。 --------------------- 参考来自 heavendai 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/heavendai/article/details/24380325?utm_source=copy

    # coding:utf-8
    import gevent
    from gevent import Greenlet
    
    from gevent.queue import JoinableQueue, Empty
    # 主队列
    
    
    
    class Actor(Greenlet):
        def __init__(self, data):
            self.data = data
            Greenlet.__init__(self)
    
        def _run(self):
            result = do_something(self.data)
            return result
    
    def do_something(data):
        print('the data is %s'%data)
    
    queue = JoinableQueue()
    
    
    def boss():
        for i in xrange(1, 1000):
            queue.put_nowait(i)
    boss()
    
    def work():
        while True:
            try:
                data = queue.get(timeout=5)
                print('data is %s'%data)
            except Empty:
                gevent.sleep(0.5)
                break
            finally:
                queue.task_done()
            # queue.join()
        # 交付给Actor
        # if data:
        #     g1 = Actor(data)
        #     g1.start()
        #     g1.join()
    for i in range(5):
        gevent.spawn(work)
    queue.join()
    
  • 相关阅读:
    MySQL同步故障:" Slave_SQL_Running:No" 两种解决办法
    mysql运维-slave_skip_errors
    linux 的mysql 主从备份
    linux 查看和设置主机名
    mysql连接数
    红帽6.9搭建yum源的2种方式(HTTP和本地)
    linux 重启服务器命令
    Linux开机启动顺序启动顺序及配置开机启动
    在Windows Server 2012的Task Scheduler里面配置自动发送邮件
    "Cannot find one of more components. Please reinstall the application"--安装VS2013之后不能正常打开的处理办法
  • 原文地址:https://www.cnblogs.com/kidl/p/9699298.html
Copyright © 2011-2022 走看看