python3 进程_multiprocessing模块

'''
多进程
优点:可以利用多核,实现并行运算
缺点:1、开销太大; 2、通信困难
使用方式跟开多线程一样
'''

多进程
import multiprocessing
import time,os

def foo(name):
    print('ok')
    print('name',name)
    print('parent process:',os.getppid())   # os.getppid()获取父进程号
    print('process id:',os.getpid())    # os.getpid()获取子进程号
    time.sleep(2)

if __name__ == '__main__':  # 开子进程必须用这种方式

    foo('main process')

    p = multiprocessing.Process(target=foo,args=('egon',))
    p.start()
    print('ending')

 

开多进程补充

def foo():
    time.sleep(2)
    print("ok")
    #print(x)

print("yuan")    # 每开启一个进程,会将主进程加载一次,也就会打印一次

if __name__ == '__main__':    # 进程从这里开始

    p=Process(target=foo,)    # 新的进程,打印一次‘yuan’
    p.start()

    p1 = Process(target=foo, )
    p1.start()

    x=123    # Linux系统,新进程会自带主进程变量,所以自进程也可以打印x值,Windows系统不会
    p.join()

    print("ending")

 

'''
进程间通讯
队列,管道,manager共享
'''
进程queue
import multiprocessing

def foo(q):
    q.put([11,'hello',True])

if __name__ == '__main__':

    q = multiprocessing.Queue() # 进程队列,主函数运行创建进程队列

    p = multiprocessing.Process(target=foo,args=(q,))
    p.start()

    print(q.get())

进程管道

from multiprocessing import Pipe,Process
def foo(a):
    a.send('hello world')
    print(a.recv())

if __name__ == '__main__':
    a,b = Pipe()
    p = Process(target=foo,args=(a,))
    p.start()

    print(b.recv())

    b.send('hi son')

manager数据共享

from multiprocessing import Process,Pipe,Manager

def foo(d,i):
    d[i] = i**2

if __name__ == '__main__':
    manager=Manager()
    mdict = manager.dict({})

    l = []
    for i in range(5):
        p = Process(target=foo,args=(mdict,i))
        p.start()
        l.append(p)

    for i in l:
        i.join()

    print(mdict)



'''
进程池
Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;
但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,就重用进程池中的进程
'''
from multiprocessing import Pool
import time

def foo(n):
    print(n)
    time.sleep(1)

if __name__ == '__main__':

    pool_obj = Pool(5)

    for i in range(100):
        pool_obj.apply_async(func=foo,args=(i,))

    pool_obj.close()
    pool_obj.join()

    print('ending')

 

posted on 2017-07-23 16:43  lucaq  阅读(392)  评论(0编辑  收藏  举报

导航