进程是资源单位, 线程是执行单位。
每一个进程至少要有一个线程,启动每一个程序默认都会有一个主线程
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 Process
def 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, ProcessPoolExecutor
def 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")