多进程学习笔记

#coding=utf-8
'''线程与进程的区别
线程同时修改一份数据时必须加锁,mutex互斥锁
什么时候使用多线程?
io操作不占用CPU
计算占用CPU,
pyhton多线程不适合cpu密集操作性的任务,适合io操作密集的任务
'''
import multiprocessing
import time
import threading

# def threadrun():
#     print threading._get_ident()
#
# def run(name):
#     time.sleep(2)
#     print 'hello',name
#     t = threading.Thread(target=threadrun)     #进程里面再启动线程
#     t.start()
#
# if __name__ ==  '__main__':
#     for i in range(10):
#         p = multiprocessing.Process(target=run,args=('zq%s'%i,))    #启动进程
#         p.start()
#     #p.join()
#
# #获取进程号
# from multiprocessing import Process
# import os
#
#
# def info(title):
#     print(title)
#     print('module name:', __name__)
#     print('parent process:', os.getppid())
#     print('process id:', os.getpid())
#     print("

")
#
#
# def f(name):
#     info('33[31;1mcalled from child process function f33[0m')
#     print('hello', name)
#
# if __name__ == '__main__':
#     info('33[32;1mmain process line33[0m')
#     p = Process(target=f, args=('bob',))
#     p.start()
#     # p.join()
#进程之间的通讯   线程之间的队列可以共享使用,但是进程之间不行,线程的队列不可以传给另一个进程使用
#如果想使用,必须使用进程队列:Queue
'''
主进程将进程队列当做参数传给子进程,实际上是克隆一个进程队列给子进程,并不是共享,
但是当主进程往主进程序列put东西的时候,主进程队列会通过pickle数据实例化把主进程
队列的数据分享克隆给子进程的序列,
'''

# from multiprocessing  import Process
# from multiprocessing  import Queue
# def f(qq):
#     qq.put([42,None,'zq'])
#
# if __name__ == '__main__':
#     q = Queue()
#     p = Process(target=f,args=(q,))
#     p.start()
#     print q.get()
#     p.join()
#两个进程之间通信的另一种方法:管道
# from multiprocessing import Process,Pipe
# def f(conn):
#     conn.send(['12341','qweqwe'])
#     conn.close()
#
# if __name__ == '__main__':
#     parent_conn,child_conn = Pipe()
#     p = Process(target=f,args=(child_conn,))
#     p.start()
#     print  parent_conn.recv()
#     p.join()

#两个进程之间分享数据之:manager    manager自带进程锁,不需要设置
# from multiprocessing import Process,Manager
# import os
#
# def f(dict1,list1):
#     dict1[os.getpid()] = os.getpid()
#     list1.append(os.getpid())
#     print list1
#
# if __name__ == '__main__':
#     with Manager() as manager:
#         d = manager.dict()     #生成一个字典可以在多个进程之间传递和共享
#         l= manager.list(range(5)) #生成一个列表可以在多个进程之间传递和共享
#         p_objlist = []
#         for i in range(10):
#             p = Process(target=f,args=(d,l))
#             p.start()
#             p_objlist.append(p)
#         for res in p_objlist:
#             res.join()
#
#         print d
#         print l

#进程锁   用于屏幕共享,比如打印进程1的数据时候会插入进程2的数据
# from multiprocessing import Process,Lock
# def f(l,i):
#     l.acquire()
#     print ' I am %s'%i
#     l.release()
#
# if __name__ == '__main__':
#     lock= Lock()
#     for num in range(100):
#         Process(target=f,args=(lock,num)).start()

#进程池   防止进程过多占用过多内存指定同时执行的进程数量,其他进程属于挂起状态
from multiprocessing import Process,Pool
import time
import os
def Foo(i):
    time.sleep(1)
    print 'in process',os.getpid()
    return i + 100,'a'

def  Bar(arg):                #回调
    print 'exec done',arg,os.getpid()

if __name__ == '__main__':
    pool = Pool(processes=3)    #允许进程池同时放入进程的数量
    print '主进程的ID:',os.getpid()
    for i in range(10):
        pool.apply_async(func=Foo,args=(i,),callback=Bar)  #callback为回调函数,每个子进程完成会干的事,在主进程中进行的  Foo的返回值的参数给了Bar函数
        #pool.apply()  #串行
    print 'end'
    pool.close()
    pool.join()     #必须先关闭进程池再join,顺序不能错,否则程序直接关闭
原文地址:https://www.cnblogs.com/qiangayz/p/8627979.html