资讯专栏INFORMATION COLUMN

多任务-----协程gevent的使用总结。

anRui / 2142人阅读

摘要:协程一,迭代器能实现一定的数据,但是又不会占用很大的空间,协程切换任务资源小,效率高。迭代器对象必须要有和方法。如果数据量很大的情况下,最好使用创建迭代器的方式来节省内存空间。

协程

一,迭代器iterable 能实现一定的数据,但是又不会占用很大的空间,协程切换任务资源小,效率高。
如何判断某一类型是否可以迭代

from collections import Iterable



print(isinstance([11,2,3], Iterable))

python2是如下实现的,python3中将range改成了xrange
range(2000)生成2000个值的结果,会占用很大的内存空间
xrange(2000)是指生成2000个值的方式,占用很小的空间。

如果一个对象是迭代器,那么一定可以迭代,如果一个对象可以迭代,但不一定是迭代器。

迭代器对象必须要有__iter__和__next__方法。

如果数据量很大的情况下,最好使用创建迭代器的方式来节省内存空间。
eg:

class Fibo(object):
    def __init__(self, all_num):
        self.all_num = all_num
        self.current_num = 0
        self.a = 0
        self.b = 1


    def __iter__(self):
        return self


    def __next__(self):
        if self.current_num < self.all_num:
            ret = self.a
            self.a, self.b = self.b, self.a + self.b
            self.current_num += 1

            return ret

        else:
            raise StopIteration

fibo = Fibo(20)

for temp in fibo:
    print(temp)

二, 生成器generator
生成器是一种特殊的迭代器,可以让函数暂停执行。所以可以利用生成器实现多任务。
生成迭代器有两种方式:

(x*2 for x in range(10)) 返回值就是生成器。

含有yield的函数,此时他不再是一个函数,而是一个生成器对象

启动生成器有两种方式,next和send,next优先

eg:

def fibo(max_num):
    a, b = 0, 1
    current_num = 0
    while current_num < max_num:
        yield a
        a, b = b, a + b
        current_num += 1

fi = fibo(20)
while True:
    try:
        ret = next(fi)
        print(ret)
    except:
        break

三,协程greenlet、gevent完成多任务
gevent是协程最常用的一种方式。当线程在等待执行浪费的时间,可以用协程来解决。协程会在等待时间去执行别的方法。
eg:协程的实际使用

def download_pic(img_name, img_url):
    request = urllib.request.urlopen(img_url)
    img_content = request.read()

    with open(img_name, "wb") as f:
        f.write(img_content)


def main():
    gevent.joinall([
        gevent.spawn(download_pic, "1.jpg", "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1556006133066&di=6c4ea03a666b333328d59163b8137de9&imgtype=0&src=http%3A%2F%2Fattach.bbs.miui.com%2Fforum%2F201408%2F27%2F103420lzrq3jcimigfjmuw.jpg"),
        gevent.spawn(download_pic, "2.jpg", "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1556006133066&di=1f17489eb4f7fd3ce4f16c2365fab82a&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fblog%2F201511%2F08%2F20151108150337_tu32m.jpeg")
    ])


if __name__ == "__main__":
    main()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43637.html

相关文章

  • python---协程

    摘要:随着我们对于效率的追求不断提高,基于单线程来实现并发又成为一个新的课题,即只用一个主线程很明显可利用的只有一个情况下实现并发。作为的补充可以检测操作,在遇到操作的情况下才发生切换协程介绍协程是单线程下的并发,又称微线程,纤程。 引子 之前我们学习了线程、进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位。按道理来说我们已经算是把cpu的利用率提高很多了。...

    lolomaco 评论0 收藏0
  • python大佬养成计划----协程

    摘要:协程,又称微线程,纤程。最大的优势就是协程极高的执行效率。生产者产出第条数据返回更新值更新消费者正在调用第条数据查看当前进行的线程函数中有,返回值为生成器库实现协程通过提供了对协程的基本支持,但是不完全。 协程,又称微线程,纤程。英文名Coroutine协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。 最大的优势就是协程极高...

    svtter 评论0 收藏0
  • 谈谈Python协程技术演进

    摘要:事件循环是异步编程的底层基石。对事件集合进行轮询,调用回调函数等一轮事件循环结束,循环往复。协程直接利用代码的执行位置来表示状态,而回调则是维护了一堆数据结构来处理状态。时代的协程技术主要是,另一个比较小众。 Coding Crush Python开发工程师 主要负责岂安科技业务风险情报系统redq。 引言 1.1. 存储器山 存储器山是 Randal Bryant 在《深入...

    zhiwei 评论0 收藏0
  • Python协程(真才实学,想学进来)

    摘要:所以与多线程相比,线程的数量越多,协程性能的优势越明显。值得一提的是,在此过程中,只有一个线程在执行,因此这与多线程的概念是不一样的。 真正有知识的人的成长过程,就像麦穗的成长过程:麦穗空的时候,麦子长得很快,麦穗骄傲地高高昂起,但是,麦穗成熟饱满时,它们开始谦虚,垂下麦芒。 ——蒙田《蒙田随笔全集》 上篇论述了关于python多线程是否是鸡肋的问题,得到了一些网友的认可,当然也有...

    lykops 评论0 收藏0
  • python大佬养成计划--协程实现TCP连接

    摘要:协程实现连接在网络通信中,每个连接都必须创建新线程或进程来处理,否则,单线程在处理连接的过程中,无法接受其他客户端的连接。所以我们尝试使用协程来实现服务器对多个客户端的响应。 协程实现TCP连接 在网络通信中,每个连接都必须创建新线程(或进程) 来处理,否则,单线程在处理连接的过程中, 无法接受其他客户端的连接。所以我们尝试使用协程来实现服务器对多个客户端的响应。与单一TCP通信的构架...

    fuchenxuan 评论0 收藏0

发表评论

0条评论

anRui

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<