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!")

results matching ""

    No results matching ""