一个应用程序在运行时就是一个进程,一个进程默认只有一个主线程,也可以有多个线程,同时执行不同的任务;本次课程主要是实现如何让进程可以进行多线程工作
一个进程就像一个工厂,多个进程就像工厂例的工人,每个工人之间的工作相互之间不影响
让一个进程多线程工作有两种实现方式:
①.直接导入treading模块种的Tread类并创建子线程对象
②.导入treading模块种的Tread类,创建一个Tread的子类,并用这个子类创建子线程对象
一. 在进程种创建Tread类的对象
1. 创建线程对象 - 子线程
线程对象 = Thread(target=函数, args=元组)
说明:
target - 函数,需要在子线程中执行的任务(会在子线程中调用)
args - target对应的函数在调用的时候传的参数
2. 让子线程执行子线程中的任务
线程对象.start()
在子线程中调用target对用的函数,并且将args中的元素作为参数
比如在一个进程中模拟下载电影:
from treading import Tread
from datetime import datetime
import time
def download(self, movie_name)
print('%s开始下载了,开始时间是%s' % (movie_name, datetime.time()))
time.sleep(5)
print('%s下载完成了,完成时间是%s' % (movie_name, datetime.time()))
# 创建线程对象 - 子线程
t1 = Tread(target=download, args=('暮光之城'))
t2 = Tread(target=download, args=('两只老虎'))
t3 = Tread(target=download, args=('卧虎藏龙'))
# 让子线程执行子线程中的任务
t1.start()
t2.start()
t3.start()
二. 在进程种创建Tread类的子类的对象
还是下载电影的例子:
from treading import Tread
from datetime import datetime
import time
class DownloadTread(Tread): # 创建Tread的子类
def __init__(self, mvoie_name) # 创建子类的对象属性
super().__init__() # 继承父类的属性
self.movie_name = movie_name
# run方法是在子线程中自动调用的,除了self之外不能有其他的参数
def run(self) -> None:
print('%s开始下载,开始时间是:%s' % (self.movie_name, datetime.now()))
time.sleep(5)
print('%s下载结束,结束时间是:%s' % (self.movie_name, datetime.now()))
t1 = DownloadTead('暮光之城')
t2 = DownloadTead('两只老虎')
t3 = DownloadTead('卧虎藏龙')
t1.start
t3.start
t2.start
join的用法
线程对象.join()
其他代码
这儿的其他代码会在线程对象中的任务执行完后才执行