1、使用 multiprocessing 库,使用线程池的 apply_async()方法传入任务函数,任务函数的参数
import os
from multiprocessing import Pool
from time import sleep
def task(name):
print("正在执行{}任务, 进程号:{}".format(name, os.getpid()))
sleep(1)
print("{}任务完成,进程号:{}".format(name, os.getpid()))
if __name__ == '__main__':
# 设置线程数量
pool = Pool(5)
tasks = ["打篮球", "打乒乓球", "下军棋", "视频剪辑", "学习", "吃饭", "睡觉"]
for i in tasks:
# async全称 asynchronous 异步的
pool.apply_async(task, args=(i,))
pool.close()
# 和close方法联用,主线程运行结束后,子线程继续运行
pool.join()
2、使用线程池的 apply_async()方法,传入回调函数
import os
from multiprocessing import Pool
from time import sleep
container = []
def task(name):
# print("正在执行{}任务, 进程号:{}".format(name, os.getpid()))
sleep(1)
# print("{}任务完成,进程号:{}".format(name, os.getpid()))
return "{}任务完成,进程号:{}".format(name, os.getpid())
def callback_func(n):
container.append(n)
if __name__ == '__main__':
# 设置线程数量
pool = Pool(5)
tasks = ["打篮球", "打乒乓球", "下军棋", "视频剪辑", "学习", "吃饭", "睡觉"]
for i in tasks:
# async全称 asynchronous 异步的
# 注意:这里的 callback= 后面是函数名 callback_func,不能加括号 callback_func()),
# 否则报错:TypeError: callback_func() missing 1 required positional argument: 'n'
pool.apply_async(task, args=(i,), callback=callback_func)
pool.close()
# 和close方法联用,主线程运行结束后,子线程继续运行
pool.join()
for i in container:
print(i)
3、阻塞式线程池,apply方法
import os
from multiprocessing import Pool
from time import sleep
def task(name):
print("正在执行{}任务, 进程号:{}".format(name, os.getpid()))
sleep(1)
print("{}任务完成,进程号:{}".format(name, os.getpid()))
if __name__ == '__main__':
# 设置线程数量
pool = Pool(5)
tasks = ["打篮球", "打乒乓球", "下军棋", "视频剪辑", "学习", "吃饭", "睡觉"]
for i in tasks:
# 阻塞式的参数没有回调函数
pool.apply(task, args=(i,))
pool.close()
pool.join()
4、非阻塞式线程池技术和阻塞式线程池技术的不同点是什么?
(1)非阻塞式用了队列,阻塞式不用队列;
(2)非阻塞式在规定数量内的进程一起执行,阻塞式是排队执行;
(3)非阻塞式更你能体现作用;