zoukankan      html  css  js  c++  java
  • python多进程(multiprocessing)

        最近有个小课题,需要用到双进程,翻了些资料,还算圆满完成任务。记录一下~

    1.简单地双进程启动

        同时的调用print1()和print2()两个打印函数,代码如下:

    #/usr/bin/python
    
    import multiprocessing
    import time
    
    run = 1
    def print1():
        while run == 1:
            print 'print 1'
            time.sleep(1)
    def print2():
        while run == 1:
            print 'print 2'
            time.sleep(1)
    
    if __name__ == '__main__':
        p1 = multiprocessing.Process(target = print1,)
        p2 = multiprocessing.Process(target = print2,)
        p1.start()
        p2.start()

    结果:

    print 1
    print 2
    print 1
    print 2
    ...
    

        在课题中遇到了进程p2要使用进程p1中数据的问题,考虑使用IPC的方法来处理,首先考虑了multiprocessing包里地Pipe类来实现。

    2.Pipe

        Pipe可以是单向(half-duplex),也可以是双向(duplex)。通过multiprocessing.Pipe(duplex = False) 创建单向管道(默认为双向)。一个进程从Pipe一段输入对象,然后被Pipe另一端的进程接收,单向管道只允许管道一端的进程输入,而双向管道则允许从两端输入。

        单向传输,代码如下:

    #/usr/bin/python
    
    import multiprocessing
    import time
    
    run = 1
    def print1(pipe):
        num = 0
        while run == 1:
            print 'print 1:'
            pipe.send(str(num))
            num = num + 1
            time.sleep(1)
    def print2(pipe):
        while run == 1:
            print 'print 2:'+pipe.recv()
            time.sleep(2)
    
    if __name__ == '__main__':
        pipe = multiprocessing.Pipe(duplex=False)
        p1 = multiprocessing.Process(target = print1,args = (pipe[1],))
        p2 = multiprocessing.Process(target = print2,args = (pipe[0],))
        p1.start()
        p2.start()

    结果:

    print 1:
    print 2:0
    print 1:
    print 1:
    print 2:1
    print 1:
    print 1:
    print 2:2
    print 1:
    print 1:
    print 2:3
    print 1:
    print 1:
    print 2:4

         双向传输,代码如下:

    #/usr/bin/python
    
    import multiprocessing
    import time
    
    run = 1
    def print1(pipe):
        while run == 1:
            pipe.send('1')
            print 'print 1:'+pipe.recv()
            time.sleep(1)
    def print2(pipe):
        while run == 1:
            pipe.send('2')
            print 'print 2:'+pipe.recv()
            time.sleep(1)
    
    if __name__ == '__main__':
        pipe = multiprocessing.Pipe(duplex=True)
        p1 = multiprocessing.Process(target = print1,args = (pipe[0],))
        p2 = multiprocessing.Process(target = print2,args = (pipe[1],))
        p1.start()
        p2.start()
    

    结果:

    print 2:1
    print 1:2
    print 2:1
    print 1:2

    3.共享内存

        因为课题中,两个进程的循环时间不同,接收进程慢于发送进程,使用双进程的话,会造成进程等待,而单进程的话,接收进程是从队列中按顺序取数据,不能获取实时更新数据,所以考虑使用资源共享解决这一问题。

    #/usr/bin/python
    
    import multiprocessing
    import time
    
    run = 1
    def print1(data,arr):
        while run == 1:
            print 'print 1:'
            data.value = data.value + 1
            arr[0] = data.value
            time.sleep(1)
    def print2(data,arr):
        while run == 1:
            print 'print 2:'+str(data.value)
            print arr[:]
            time.sleep(2)
    
    if __name__ == '__main__':
        data = multiprocessing.Value('i',0) #整数
        arr = multiprocessing.Array('d',range(10)) #列表
        p1 = multiprocessing.Process(target = print1,args = (data,arr))
        p2 = multiprocessing.Process(target = print2,args = (data,arr))
        p1.start()
        p2.start()
    

    结果:

    print 2:0
    [print 1:
    0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
    print 1:
    print 2:2
    [2.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
    print 1:
    print 1:
    print 2:4
    [4.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
    print 1:
    print 1:
    print 2:6
    [6.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
    ...
  • 相关阅读:
    深入理解计算机系统 第六章 存储器层次结构 第二遍
    深入理解计算机系统 第六章 存储器层次结构
    深入理解计算机系统 第八章 异常控制流 Part2 第二遍
    深入理解计算机系统 第八章 异常控制流 part2
    深入理解计算机系统 第八章 异常控制流 Part1 第二遍
    深入理解计算机系统 第八章 异常控制流 part1
    深入理解计算机系统 第三章 程序的机器级表示 Part2 第二遍
    深入理解计算机系统 第三章 程序的机器级表示 part2
    深入理解计算机系统 第三章 程序的机器级表示 Part1 第二遍
    深入理解计算机系统 第三章 程序的机器级表示 part1
  • 原文地址:https://www.cnblogs.com/ryuham/p/4835595.html
Copyright © 2011-2022 走看看