import time
import threading
from threading import Thread
from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED, as_completed
def sleep_task(sleep_time): # 定义单线程函数,用于多线程中执行
print("sleep {} seconds start!".format(sleep_time))
time.sleep(sleep_time)
print("sleep {} seconds end!".format(sleep_time))
if __name__ == "__main__":
start_time = time.time()
t1 = Thread(target=sleep_task, args=(2,)) # 创建线程对象,调用函数,并传入参数
t1.setDaemon(True) # 开启守护线程,当主线程结束后,强制退出所有线程。因为线程非阻塞,开启后,如果所有语句执行完毕就终止所有线程。
t1.setName("a") # 为线程设置名字,需要在start之前
t1.start() # 线程开始(非阻塞)。开始线程后,会默认启动一个主线程。同时,会马上执行后面的语句。
# t1.join() # 阻塞,等待线程1完成后再执行后面的语句,与setDaemon分开使用
# threading.current_thread().getName() # 获取当前线程的名字
locker = threading.Lock() # Lock不支持嵌套,会造成死锁(争抢资源,或者释放前锁多次会造成),但效率比RLock高
locker.acquire() # 加锁
# ......
locker.release() # 释放锁
locker2 = threading.RLock() # RLock支持嵌套,锁多次都不会造成死锁,推荐使用
locker2.acquire() # 加锁
# ......
locker2.release() # 释放锁
t2 = Thread(target=sleep_task, args=(3,)) # 创建第2个线程
t2.setDaemon(True)
t2.start()
# t2.join()
time.sleep(1)
end_time = time.time()
print("last_time: {}".format(end_time - start_time))
## 线程池
executor = ThreadPoolExecutor(max_workers=3) # 定义线程池,设置最大线程数量
thread_list = [] # 储存线程
thread_count = 0
for i in range(3):
thrd = executor.submit(sleep_task, i) # 将线程添加到线程池
thread_list.append(thrd) # 将当前线程存入列表,用于后面线程完成后,获取线程返回的结果
thread_count += 1
result_list = [] # 用于接收线程返回的结果
# 因为线程开启后,默认就不管了,如果需要获取线程返回的结果,需要等待线程运行完成
for task in as_completed(thread_list): # 等待线程全部完成
result_list.append(task.result()) # 获取线程的结果