程序在运行是会默认创建一个线程,这就是主线程,有时一个主线程运行会很慢,这时可以创建一个或多个另外到线程在进行任务,这就是多线程
导入时间模块
import time
导入线程模块
from threading import Thread
-
多线程的基本用法
要执行的方法 def func(): print('start\n') time.sleep(2) print('end\n') if __name__ == '__main__': 创建一个列表,用于装子线程对象 t_list = []; for i in range(100): 创建一个子线程对象,将要执行的方法给它 t = Thread(target=func) 添加到列表中 t_list.append(t) 循环遍历每个子线程,并开始执行 for i in t_list: i.start() 循环遍历每个列表,并等待每个子线程执行完 for i in t_list: i.join()#等待线程结束,谁调用,就等待谁 print('主线程结束')
-
声明一个类继承Thread 使用多线程
class myThread(Thread): 初始化 def __init__(self): super(myThread, self).__init__() def run(self):#必须要写,线程执行的内容 print('1111\n') time.sleep(2) print('end\n') if __name__=='__main__': 循环 for i in range(10): t = myThread() t.setDaemon(True)#设置子线程的守护线程,当主线程结束,子线程也结束 t.start() print('主线程结束了')
-
互斥锁
因为系统中的资源是共享的,所以,有时会有多个线程同时访问一个内容,会不安全,所以要加个一个锁,来保证同时只用一个线程访问 导入Lock莫款 from threading import Lock 锁实例 lock = Lock() lock.acquire()#加锁 ---这里是需要加锁的地方--- lock.release()#解锁
-
队列
导入队列模块 import queue q = queue.Queue(3)#实例 指定队列长度 q.put(1)#添加一个元素进队列 q.put(2)#添加 q.put(3)#添加 print(q.get())#获取一个元素从队列 print(q.get())#获取 print(q.get())#获取 #put在队列满了后,阻塞线程 #get在队列空了后,阻塞线程 #q.qsize()#获取队列的长度
-
线程池
主线程将任务提交给线程池,并不关心是哪个线程执行的,线程池则负责接受任务,将任务分配给空闲的线程去执行
#线程池 #python内置线程池 导入线程池 from multiprocessing.pool import ThreadPool 导入时间模块 import time pool = ThreadPool()#实例化线程池 要执行的方法 def helloLiping(): print('start\n') time.sleep(2) print('end\n') for i in range(10): pool.apply_async(helloLiping)#添加任务到线程池 pool.close()#关闭 pool.join()#等待线程执行完成