美文网首页Python
python多线程与多进程

python多线程与多进程

作者: 冬季恋歌1218 | 来源:发表于2018-04-23 11:13 被阅读51次

    Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多线程(Thread)的情况下,不能发挥多核的优势。而使用多进程(Multiprocess),则可以发挥多核的优势真正地提高效率。

    单核cpu执行多任务的原理:操作系统交替轮流地执行各个任务。先让任务1执行0.01秒,然后切换到任务2执行0.01秒,再切换到任务3执行0.01秒...这样往复地执行下去。由于cpu的执行速度非常快,所以使用者的主观感受就是这些任务在并行地执行。

    多核cpu执行多任务的原理:由于实际应用中,任务的数量往往远超过cpu的核数,所以操作系统实际上是把这些多任务轮流地调度到每个核心上执行。

    Python多进程编程

    1. multiprocessing

    multiprocessing是Python提供的一个跨平台的多进程模块,通过它可以很方便地编写多进程程序,在不同的平台(Unix/Linux, Windows)都可以执行。如:

    2. Pool 

      某些情况下,我们希望批量创建多个子进程,或者给定子进程数的上限,避免无限地消耗系统的资源。通过Pool(进程池)的方式,就可以完成这项工作,下面是使用Pool的代码:

    close()方法和terminate()方法的区别:

      close:关闭进程池,使之不能再添加新的进程。已经执行的进程会等待继续执行直到结束。

      terminate:强制终止线程池,正在执行的进程也会被强制终止。

     3. 进程间通信 

      Python的multiprocessing模块提供了多种进程间通信的方式,如Queue、Pipe等。

      3.1 Queue、Lock

      Queue是multiprocessing提供的一个模块,它的数据结构就是"FIFO——first in first out"的队列,常用的方法有:put(object)入队;get()出队;empty()判断队列是否为空。

      Lock:当多个子进程对同一个queue执行写操作时,为了避免并发操作产生冲突,可以通过加锁的方式使得某个子进程对queue拥有唯一的写权限,其他子进程必须等待该锁释放后才能再开始执行写操作。

      下面就是使用Queue进行进程间通信的代码:在父进程里创建两个子进程,分别实现对queue的读和写操作.

    #!/usr/bin/python

    # -*- coding: utf-8 -*

    import  sys

    reload (sys)

    sys.setdefaultencoding('utf-8')

    from multiprocessing import Process, Queue, Lock

    import os, time, random

    #写数据进程

    def write(q, lock, name):

        print 'Child Process %s starts' % name

        #获得锁

        lock.acquire()

        for value in ['A' , 'B', 'C']:

            print 'Put %s to queue...' % value

            q.put(value)

            time.sleep(random.random())

        #释放锁

        lock.release()

        print 'Child Process %s ends' % name

    #读数据进程

    def read(q, lock, name):

        print 'Child Process %s starts' % name

        while True: #持续地读取q中的数据

            value =q.get()

            print 'Get %s from queue.' % value

        print 'Child Process %s ends' % name

    if __name__ == "__main__":

        #父进程创建queue,并共享给各个子进程

        q= Queue()

        #创建锁

        lock = Lock()

        #创建第一个“写”子进程

        pw = Process(target = write , args=(q, lock, 'WRITE', ))

        #创建“读”进程

        pr = Process(target = read, args=(q,lock, 'READ',))

        #启动子进程pw,写入:

        pw.start()

        #启动子进程pr,读取:

        pr.start()

        #等待pw结束:

        pw.join()

        #pr是个死循环,通过terminate杀死:

        pr.terminate()

        print 'Test finish.'

    3.2 Pipe

    Pipe是另一种进程间通信的方式,俗称“管道”。它由两端组成,一端往管道里写入数据,另一端从管道里读取数据。

    下面就是使用Pipe通信的代码:

    python多线程threading模块

    多线程加锁例子:

    python递归锁RLock

    相关文章

      网友评论

        本文标题:python多线程与多进程

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