线程池的使用

前言:

在python中经常会用到异步,线程池,进程池,解决IO的操作,在爬虫中不建议使用进程池(消耗太大)

目标:

学会使用线程池

在使用多线程之前,先看下单线程

示例:

import  time
def f1():
    for i in range(3):
        print(f"我饿了{i}")
        time.sleep(1)
def f2():
    for i in range(3):
        print(f"开饭了{i}")
        time.sleep(1)
if __name__ == "__main__":
    start=time.time()
    f1()
    f2()
    end=time.time()
    print("消耗时间为:",end-start)

输出结果如下:

我饿了0
我饿了1
我饿了2
开饭了0
开饭了1
开饭了2
消耗时间为: 6.048200368881226

可以看出,程序是按顺序执行的,f1完全执行完毕才会执行f2,这个时候就是单任务

 

接下来演示多线程

基础用法

# 导入threading模块
import threading
from threading import  Thread
# 使用threading模块中的Thread创建一个对象
t1=threading.Thread(target=xx) # xx为函数的名字
# 调用这个实例对象的start方法让这个线程开始运行
t1.start()

# 带参数的函数
def my_func(a,b):
print(a,b)

t=threading.Thread(target=my_func,args=(100,200))
t.start() # 启动线程
t.join() # 等待结束

多线程示例:

import  time
import threading
def f1():
    for i in range(3):
        print(f"我饿了{i}")
        time.sleep(1)
def f2():
    for i in range(3):
        print(f"开饭了{i}")
        time.sleep(1)
if __name__ == "__main__":
    t1=threading.Thread(target=f1)
    t2=threading.Thread(target=f2)
    t1.start()
    t2.start()
    print("--------")

输出结果

我饿了0
开饭了0
--------
开饭了1
我饿了1
开饭了2
我饿了2

不知道为什么print没有在最后输出。

 

线程池

from concurrent.futures import ThreadPoolExecutor
import  time

def func(name):
     print(name)
     time.sleep(3)

start=time.time()
with ThreadPoolExecutor(20) as t:
     for i in range(20):
         t.submit(func,"张三:%s"%i)

# pool=ThreadPoolExecutor(10)
# for i in range(20):
#     pool.submit(func,"%s:张三"%i)
# pool.shutdown()
和with效果一样

end=time.time()
spend=end-start
print(f"耗时间为:{spend}")

 

posted @ 2023-05-23 10:59  羊脂玉净瓶  阅读(9)  评论(0)    收藏  举报