美文网首页
python多线程、多进程、协程的使用

python多线程、多进程、协程的使用

作者: halleyshx | 来源:发表于2018-10-24 17:30 被阅读0次

python多线程、多进程、协程的使用

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

一、多线程

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

2.使用

import threadingimport time def Traversal_5(interval):

    foriinxrange(5):

        print'Traversal_5:',i

        time.sleep(interval)def Traversal_10(interval):

    foriinxrange(10):

        print'Traversal_10:',i

        time.sleep(interval)if__name__=='__main__':

    print'start time:'    t1 = int(time.time())

    tasks=[Traversal_5,Traversal_10]

    threads = []

    fortaskin tasks:

        t = threading.Thread(target=task,args=(1,))

        threads.append(t)

    fortin threads:

        t.setDaemon(True)

        t.start()

    fortin 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):

        foriinxrange(5):

            print'process name:',name,'\tindex:',i

            time.sleep(interval)if__name__=='__main__':

    print'start time:'    t1 = int(time.time())

    jobs = []

    forxinxrange(2):

        p = multiprocessing.Process(target = Traversal, args=(1,'Traversal_'+str(x)))

        p.start()

        jobs.append(p)

    forjobin jobs:

        job.join()

    print'end main total time:',int(time.time())-t1

3.结果

4.结果分析

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

三、协程

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

2.使用

fromgeventimport monkey; monkey.patch_all(); fromgevent.poolimport Pool import time def Traversal(job):

    print'job:',job

    time.sleep(1)if__name__=='__main__':

    print'start time:'    t1 = int(time.time())

    jobs = [iforiinxrange(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 fromgeventimport monkey; monkey.patch_all(); fromgevent.poolimport 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 = [iforiinxrange(5)]

        pool = Pool(5)

        pool.map(Traver, jobs) if__name__=='__main__':

    print'start time:'    t1 = int(time.time())

    jobs = []

    forxinxrange(2):

        p = multiprocessing.Process(target = Traversal, args=(1,'Traversal_'+str(x)))

        p.start()

        jobs.append(p)

    forjobin jobs:

        job.join()

    print'end main total time:',int(time.time())-t1

3.结果

4.结果分析

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

五、总结

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

相关文章

  • python多线程、多进程、协程的使用

    python多线程、多进程、协程的使用 本文主要介绍多线程、多进程、协程的最常见使用,每个的详细说明与介绍有时间会...

  • Python3 异步协程函数async具体用法

    之前使用Python的人往往纠缠在多线程,多进程,评判哪个效率更高?其实,相对于别家的协程和异步,不管多线程还是多...

  • Gevent高并发网络库精解

    进程 线程 协程 异步 并发编程(不是并行)目前有四种方式:多进程、多线程、协程和异步。 多进程编程在python...

  • 浅析python的GIL

    Python中的GIL锁 在Python中,可以通过多进程、多线程和多协程来实现多任务。 在多线程的实现过程中,为...

  • python常用知识

    多线程,多进程,协程进程池 协程 字典 列表 函数 文件操作

  • 并发编程之Concurrent.futures vs Multi

    并发编程是刚需,尤其是在多I/O操作时,多线程,协程,多进程三路英雄各显神通。多线程,协程属于并发操作,多进程属于...

  • 索引 - Python

    文集主页 Python 解释器和三种栈多进程、多线程、协程、并发并行Python I/O 操作(一)Python ...

  • 简单了解进程、线程、协程

    当单任务不能满足工作的需要,只是需要使用多任务,多任务分为多进程,多线程,多协程 先有进程,进程创建线程,线程依附...

  • 多线程多进程多协程(转载)

    多线程多进程多协程(转载) Bilibili 蚂蚁学Python UP主说得很好 工作中看视频不方便,截取重点部...

  • Python多进程(Multiprocessing)的简单使用

    Python由于GIL的存在,多线程(Thread)、协程(Asyncio)可以实现并发,并行则依赖多进程(Mul...

网友评论

      本文标题:python多线程、多进程、协程的使用

      本文链接:https://www.haomeiwen.com/subject/rypxtqtx.html