python 多进程

进程:资源的集合,适用于cpu密集型操作

from multiprocessing  import Process    ###多进程
import time
import threading

def run(name):

    print ("hello %s" % name)
    t = threading.Thread(target=thread)
    t.start()

def thread():
    print (threading.get_ident())


if __name__ == '__main__':
    for i in range(10):
        p = Process(target=run,args=('%s' % i,))
        p.start()

 

进程池

进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。

进程池中有两个方法:

  • apply
  • apply_async
from  multiprocessing import Process, Pool,freeze_support
import time

def Foo(i):
    time.sleep(2)
    return i + 100

def Bar(arg):
    print('-->exec done:', arg)

if __name__ == '__main__':
    pool = Pool(5)                  ##允许进程池里同时放入5个进程
    for i in range(10):
        pool.apply_async(func=Foo, args=(i,), callback=Bar)     ##异步执行,回调函数,执行完foo后执行bar(由主进程执行)
        #pool.apply(func=Foo, args=(i,))

    print('end')
    pool.close()
    pool.join()                  # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。

 

进程间通讯

首先看示例

from multiprocessing  import Process,Queue    ###多进程
import threading,queue

def f(qq):
    qq.put([42,None,'hello'])

if __name__ == '__main__':
    q = queue.Queue()

    p = Process(target=f,args=(q,))
    p.start()
    print (q.get())

 

线程及线程间通讯

 

进程及进程间通讯

from multiprocessing  import Process,Queue    ###多进程

def f(qq):
    qq.put([42,None,'hello'])

if __name__ == '__main__':
    q = Queue()

    p = Process(target=f,args=(q,))
    p.start()
    print (q.get())

 

通过管道实现进程间通讯

from multiprocessing  import Process,Pipe    ###多进程,管道一生成会返回两个对象

def f(qq):
    qq.send([42,None,'hello'])       ####发消息
    print (qq.recv())                      ##收消息
    qq.close()

if __name__ == '__main__':
    parent_conn,children_conn = Pipe()

    p = Process(target=f,args=(children_conn,))
    p.start()

    print (parent_conn.recv())  ##收消息

    parent_conn.send("hello children")          ###发消息

 

进程间数据共享

from multiprocessing import Process, Manager
import os

def f(d, l):
    d[1] = '1'
    d['2'] = 2
    d[0.25] = None
    l.append(os.getpid())
    print(l)


if __name__ == '__main__':
    with Manager() as manager:
        d = manager.dict()               ####生成一个字典,可在进程间共享和传递

        l = manager.list(range(5))            ####生成一个列表,可在进程间共享和传递        
        p_list = []
        for i in range(10):
            p = Process(target=f, args=(d, l))
            p.start()
            p_list.append(p)
        for res in p_list:
            res.join()

        print(d)
        print(l)            ####发消

 

posted @ 2018-05-22 22:04  FRESHMANS  阅读(215)  评论(0)    收藏  举报