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]
...
posted @ 2015-09-24 15:56  dayday+up  阅读(353)  评论(0编辑  收藏  举报