本文为了说明例子,用中文作为变量写在了程序里面,一般编程最好不要那么写
概念
多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。
开启多线程的方式
方法一,直接开
from multiprocessing import Process
from threading import Thread
import time
def task(函数变量):
print('%s正在运行'%函数变量)
time.sleep(1)
print('%s运行结束'%函数变量)
t = Thread(target=task,args=('BOSS',))
t.start()
print('主线程')
方法二,用类开
from threading import Thread
import time
class MyThead(Thread):
def __init__(self, 函数变量):
super().__init__()
self.函数变量 = 函数变量
def run(self):
print('%s正在运行'%self.函数变量)
time.sleep(2)
print('BOSS')
if __name__ == '__main__':
t = MyThead('BOSS')
t.start()
print('主线程')
效果
引入join方法
主线程等待子线程运行结束再执行
from threading import Thread
import time
def task(函数变量):
print('%s 正在运行'%函数变量)
time.sleep(3)
print('%s运行结束'%函数变量)
if __name__ == '__main__':
t = Thread(target=task,args=('BOSS',))
t.start()
t.join() # 主线程等待子线程运行结束再执行
print('主线程')
效果
注意,同一个进程下多线程数据是共享的
举例
from threading import Thread
import time
等待被剥削的资金 = 100000
def task():
global 等待被剥削的资金
等待被剥削的资金 = 200
print(等待被剥削的资金)
if __name__ == '__main__':
t = Thread(target=task)
t.start()
t.join()
print(等待被剥削的资金)
效果
其他方法
from threading import Thread, active_count, current_thread
import os,time
def 要执行的函数(n):
print('正在执行',current_thread().name)#获取当前线程的名字
time.sleep(n)
if __name__ == '__main__':
A = Thread(target=要执行的函数,args=(1,))
A1 = Thread(target=要执行的函数,args=(0.1,))
A.start()
A1.start()
A.join()
print('主线程',active_count())# 统计当前正在活跃的线程数
print('主线程',os.getpid())#输出当前线程的线程号
print('主线程',current_thread().name)
效果
守护线程
守护线程是一种特殊的线程,就和它的名字一样,它是系统的守护者,在后台默默完成一些系统性的服务,比如垃圾回收线程,JIT线程就可以理解为守护线程。
与守护线程相对的是用户线程,用户线程可以认为是系统的工作线程,它会完成这个程序要完成的业务员操作。如果用户线程全部结束,则意味着这个程序无事可做。守护线程要守护的对象已经不存在了,那么整个应用程序就应该结束。
主线程运行结束之后不会立刻结束 会等待所有其他非守护线程结束才会结束,因为主线程的结束意味着所在的进程的结束
代码实现
from threading import Thread
import time
def 要执行的函数(函数变量):
print('%s正在运行'%函数变量)
time.sleep(1)
print('%s运行结束'%函数变量)
if __name__ == '__main__':
t = Thread(target=要执行的函数,args=('BOSS',))
t.daemon = True#设为守护线程
t.start()
print('主线程')
效果