import multiprocessing, time, os
'''进程同步Lock'''
# 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()同步接口,apply和apply_async直接创建了子进程
# pool.apply_async(func=foo, args=(x,))
pool.apply_async(func=foo, args=(x,), callback=bar)
# callback回调函数,就是某个动作或者函数执行成功后再去执行的函数;主进程创建子进程,callback回调函数是由主进程执行的,通过打印进程号就可发现
pool.close()
pool.join() # 必须是先close后join,这是固定顺序
print('end')