博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python多线程、多进程、协程的使用
阅读量:7095 次
发布时间:2019-06-28

本文共 3529 字,大约阅读时间需要 11 分钟。

本文主要介绍多线程、多进程、协程的最常见使用,每个的详细说明与介绍有时间会在以后的随笔中体现。

一、多线程

1.python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的、原始的线程以及一个简单的锁。threading通过对thread模块进行二次封装,提供了更方便的API来操作线程。接下来只介绍threading的常见用法。

2.使用

import threadingimport time def Traversal_5(interval):    for i in xrange(5):        print 'Traversal_5:',i        time.sleep(interval)def Traversal_10(interval):    for i in xrange(10):        print 'Traversal_10:',i        time.sleep(interval)if __name__ == '__main__':    print 'start time:'    t1 = int(time.time())     tasks=[Traversal_5,Traversal_10]     threads = []    for task in tasks:        t = threading.Thread(target=task,args=(1,))        threads.append(t)    for t in threads:        t.setDaemon(True)        t.start()    for t in threads:        t.join()    print 'end main total time:',int(time.time())-t1

3.结果

4.结果分析

单线程运行这完两个函数至少应该需要15秒,多线程情况下,两个函数同时运行,总共用时是取最长的Traversal_10这个函数的时间

二、多进程

1.由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。接下来只介绍multiprocessing的常见用法。

2.使用

import multiprocessing import time class Traversal(object):    def __init__(self,interval, name):        self.interval = interval         self.name = name        self._rungevent(self.interval, self.name)    def _rungevent(self, interval, name):        for i in xrange(5):            print 'process name:',name,'\tindex:',i            time.sleep(interval)if __name__ == '__main__':    print 'start time:'    t1 = int(time.time())     jobs = []    for x in xrange(2):        p = multiprocessing.Process(target = Traversal, args=(1,'Traversal_'+str(x)))        p.start()        jobs.append(p)    for job in jobs:        job.join()     print 'end main total time:',int(time.time())-t1

3.结果

4.结果分析

此程序相当于遍历两次0-5的函数,按理说,时间应该是10秒,因为开了2个进程,所以总花时和一次遍历时间相等

三、协程

1.协程,又称微线程,纤程。协程的特点在于是一个线程执行,那和多线程比,协程有何优势?最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。第三方的gevent为Python提供了比较完善的协程支持。接下来只介绍gevent用法

2.使用

from gevent import monkey; monkey.patch_all(); from gevent.pool import Pool import time def Traversal(job):    print 'job:',job    time.sleep(1)if __name__ == '__main__':    print 'start time:'    t1 = int(time.time())    jobs = [i for i in xrange(10)]     pool = Pool(5)    pool.map(Traversal, jobs)    print 'end main total time:',int(time.time())-t1

3.结果

3.结果分析

此程序本质是遍历0-10之间的数,应该用时10秒,由于使用了协程,开启了5个池,所以时间减少到2秒,大大减少运行时间。

四、多进程+协程

1.因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

2.使用

import multiprocessing from gevent import monkey; monkey.patch_all(); from gevent.pool import Poolimport time def Traver(job):    print 'job:',job    time.sleep(1)class Traversal(object):    def __init__(self,interval, name):        self.interval = interval         self.name = name        self._rungevent(self.interval, self.name)    def _rungevent(self, interval, name):        jobs = [i for i in xrange(5)]         pool = Pool(5)        pool.map(Traver, jobs) if __name__ == '__main__':    print 'start time:'    t1 = int(time.time())     jobs = []    for x in xrange(2):        p = multiprocessing.Process(target = Traversal, args=(1,'Traversal_'+str(x)))        p.start()        jobs.append(p)    for job in jobs:        job.join()     print 'end main total time:',int(time.time())-t1

3.结果

4.结果分析

此程序本质上是遍历2次0-5之间数据,应该使用10秒才能运行完,由于开启了两个线程和5个池的协程,结果1秒就运行完了。

五、总结

从以上小例子看,多进程、多线程和协程没有啥差别,本文也只是主要介绍其用法。但是,要是在IO密集和CPU密集的任务下,各个之间的区别就会显现,这里就不做介绍。

 

转载于:https://www.cnblogs.com/lingwang3/p/6753388.html

你可能感兴趣的文章
laravel中的表单请求类型和CSRF防护(六)
查看>>
有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水24小时后就会死亡,至少要多...
查看>>
我的友情链接
查看>>
监控指定文件所有机器的网络状况
查看>>
11、网络--Linux Bridge(网桥基础)
查看>>
监控apache脚本原理
查看>>
参观迅达云成观后感
查看>>
linux(ubuntu)查看硬件设备命令
查看>>
centos 上 GraphicsMagic安装笔记
查看>>
tomcat与resin
查看>>
android应用要搞起了
查看>>
一个简单的css3 动画例子
查看>>
关于几道SQL经典题详解
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
Facebook ATC 弱网测试项目部署
查看>>
关于p-vol和s-vol
查看>>
一八年第三天晚上十点半的thinking
查看>>
ksh和bash区别
查看>>
keepalived 组播的配置
查看>>