• 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]
    ...
  • 相关阅读:
    超几何分布
    区分概率中的事件关系
    破解概率求解的策略
    j2ee的十三种技术
    jsp第1讲(上集)
    servlet第3讲(中集)----同一用户的不同页面共享数据
    servlet第3讲(上集)----同一用户的不同页面共享数据
    servlet第2讲(下集)----通过HttpServlet实现一个用户登录网站(继承HttpServlet)
    一款基于的jQuery仿苹果样式焦点图插件
    一款基于css3的散子3D翻转特效
  • 原文地址:https://www.cnblogs.com/ryuham/p/4835595.html
Copyright © 2020-2023  润新知