import multiprocessing, time, os ''' 进程同步Lock: 对于所有在 threading 存在的同步原语,multiprocessing 中都有类似的等价物。例如,可以使用锁来确保一次只有一个进程打印到标准输出;不使用锁的情况下,来自于多进程的输出很容易产生混淆 ''' # def foo(l, i): # l.acquire() # print('hello world %s' % i) # l.release() # # if __name__ == '__main__': # l = multiprocessing.Lock() # 也是Lock锁 # l1 = [] # for i in range(10): # p = multiprocessing.Process(target=foo, args=(l, i,)) # p.start() # l1.append(p) # for t in l1: # t.join() ''' 进程池Pool: 内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进程,那么程序就会等待,直到进程池中有可用进程为止。 ''' def foo(n): time.sleep(1) print(n) return 'foo %s' % n def bar(m): '''bar函数为回调函数,那么foo的返回值会作为参数传给bar函数,bar函数可用来打印日志''' print(m) # print('hello') # print('two:', os.getpid()) # print('two:', os.getppid()) if __name__ == '__main__': pool = multiprocessing.Pool(5) # 参数5代表进程池数量,如果为空则默认使用的是本机核数 # print('one:', os.getpid()) # print('one:', os.getppid()) for x in range(100): # pool.apply(func=foo, args=(x,)) # apply()同步接口 # pool.apply_async(func=foo, args=(x,)) pool.apply_async(func=foo, args=(x,), callback=bar) # 在进程池获取一个进程,bar函数必须只能接收一个参数,foo执行成功把返回结果当作参数传给了bar函数 # callback回调函数,就是某个动作或者函数执行成功后再去执行的函数;主进程创建子进程,callback回调函数是由主进程执行的,通过打印进程号就可发现 pool.close() pool.join() # 必须是先close后join,这是固定顺序 print('end')