深圳培训网站建设网易企业邮箱
进程是资源单位, 线程是执行单位。
每一个进程至少要有一个线程,启动每一个程序默认都会有一个主线程
1.多线程的两种实现
from threading import Thread#方法一
def func(name):for i in range(10):print(name, i)if __name__ == '__main__':t = Thread(target=func, args=("jerry",)) # 创建线程并给线程安排任务#参数必须是元组,且最后一个参数后面的逗号不能忘t.start() # 多线程状态为可以开始工作状态, 具体的执行时间由CPU决定for i in range(10):print("main", i)#方法二
class MyThread(Thread): #创建一个类MyThread,继承父类Thread,#可以使用构造函数def __init__(self) 传递参数def run(self): # 固定的 -> 当线程被执行的时候, 被执行的就是run()for i in range(1000):print("子线程", i)if __name__ == '__main__':t = MyThread()# t.run() # 不能用t.run(), 调用了类中的run()方法,为单线程t.start() # 开启线程for i in range(1000):print("主线程", i)
2.多进程的两种实现
与多线程的实现方法基本一样
from multiprocessing import Processdef func():for i in range(1000):print("子进程", i)if __name__ == '__main__':p = Process(target=func)p.start()for i in range(1000):print("主进程", i)
3.进程池,线程池
# 线程池: 一次性开辟一些线程. 我们用户直接给线程池子提交任务. 线程任务的调度交给线程池来完成
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutordef fn(name):for i in range(1000):print(name, i)if __name__ == '__main__':# 创建50个线程池with ThreadPoolExecutor(50) as t:for i in range(100):t.submit(fn, name=f"线程{i}")# 等待线程池中的任务全部执行完毕. 才继续执行(守护)print("123")