pool线程池的使用
新建单一进程
#导入multiprocessing模块
import multiprocessing
import time
#定义一个简单的函数
def func(msg):
print(msg)
time.sleep(1)
if __name__ == "__main__":
#将函数作为第一个参数传入Process中,注意函数不能是类里面的函数,只能是独立定义的
#把args参数作为第二个参数传入Process中,注意下面例子中的args=("hello ", )是打包成了元组类型,可迭代,但是里面只有一个元素
p = multiprocessing.Process(target=func, args=("hello ", ))
p.start()
p.join()
print("Done!")
使用进程池
import multiprocessing
import time
#定义一个简单的函数
def func(msg):
print(msg)
time.sleep(1)
if __name__ == "__main__":
#processes=4是指最多并发的进程数
pool = multiprocessing.Pool(processes=4)
#将函数作为第一个参数传入Process中,注意函数不能是类里面的函数,只能是独立定义的
#把args参数作为第二个参数传入Process中
for item in range(3):
msg = 'hello ' + str(item)
pool.apply_async(func, (msg, ))
pool.close()
#pool.join()是用来等待进程池中的worker进程执行完毕,防止主进程在worker进程结束前结束。但必pool.join()必须用在pool.close()之后
pool.join()
print("Done!")
而课程中使用的pool.map()
其实道理是一样的,不过第二个参数一定要是可迭代的,相当于参数一个个传进去对应着前面的函数。
如以上代码可以这么改:
import multiprocessing
import time
def func(msg):
print(msg)
time.sleep(1)
if __name__ == "__main__":
pool = multiprocessing.Pool(processes=4)
msg_list = []
for item in range(3):
msg_list.append( 'hello ' + str(item) )
pool.map(func,msg_list)
pool.close()
pool.join()
print("Done!")