import time
# 导入用于多线程操作的库
# 这样子仅需要在自定义的函数前面使用装饰器即可将函数开启新的线程
import multitasking
import signal
# 按快捷键 ctrl + c 终止已开启的全部线程
signal.signal(signal.SIGINT, multitasking.killall)
# 多线程装饰器
@multitasking.task
def say(number: int):
print(number)
time.sleep(0.5)
start_time = time.time()
for i in range(5):
say(i)
# 等待全部线程执行完毕
multitasking.wait_for_tasks()
end_time = time.time()
print('耗时:', end_time-start_time, '秒')
import threading
from concurrent.futures import *
import random
import datetime
#创建锁
totalSuccLock = threading.Lock()
#定义一个全局变量
class GlobalVar:
totalSucc = 0
#创建线程对象
class ThreadClass(threading.Thread):
def __init__(self,a):
super().__init__()#调用父类的init方法,这句话必须写
self.a = a
def run(self) :
testThreading(self.a)
def testThreading(a):
totalSuccLock.acquire()
print(str(a))
#获得锁
GlobalVar.totalSucc =GlobalVar.totalSucc + 1
#释放锁
totalSuccLock.release()
return random.random
if __name__=="__main__":
start = datetime.datetime.now()
#创建线程池
executor = ThreadPoolExecutor(max_workers=16)
futureList = []
#第一种创建线程的方式:指定方法
for i in range(0,500):
#错误示范
#threadObj = threading.Thread(target=testThreading(i))
#正确示范
#threadObj = threading.Thread(target=testThreading,args=("a"))
#threadObj.start()
#第二种创建线程的方式:实例化线程对象
#threadObj = ThreadClass("a")
#threadObj.start() #不能直接调用run方法启动线程
#第三种使用线程池的方法,创建线程
future = executor.submit(testThreading,i)
#获取线程执行结果,阻塞线程的循环
# future.result()
#创建列表先把结果存储起来
futureList.append(future)
for future in futureList:
print("线程池里的线程执行结束,结果 = ",future.result())
#testThreading(i)
print("-----------------主线程执行完成-------,用时 = ",datetime.datetime.now() - start ,",totalSucc = ",GlobalVar.totalSucc)