python -- 多线程基础
声明 – python的多进程并不是真正的并行(GIL)
python里因为有GIL的存在
所以python在同一时刻只允许一个线程进行运算
但python的多线程还是会节省下来IO的时间(IO时将执行权限交给下一个线程)
添加线程
引入所需要的库
import threading
获取已激活线程数
print(threading.active_count())#打印已激活线程数
查看所有线程信息
print(threading.enumerate())#打印所有线程信息
查看现在正在运行的线程
print(threading.current_thread())#打印现在正在运行的线程
添加线程
def thread_job():#定义线程的函数
print('This is a thread of %s' % threading.current_thread())
def main():
thread = threading.Thread(target=thread_job,)#定义线程
thread.start() # 让线程开始工作
if __name__ == '__main__':
main()
添加带参数的线程
t = threading.Thread(target=job,args=(data[i],q))#target后面的函数名不加括号,args后面的是参数
join(等待某线程结束在继续运行)
def T1_job():#线程一
print("T1 start\n")
for i in range(10):
print(i)
print("T1 finish\n")
def T2_job():#线程二
print("T2 start\n")
print("T2 finish\n")
thread_1 = threading.Thread(target=T1_job, name='T1')#定义线程1
thread_2 = threading.Thread(target=T2_job, name='T2')#定义线程2
thread_1.start() # 开启T1
thread_1.join() #####重点,等待线程1结束在开始运行线程2
thread_2.start() # 开启T2
Queue 存储进程结果
引入库
from queue import Queue
存储
import threading
from queue import Queue
def job(l,q):## 线程执行的函数
for i in range (len(l)):
l[i] = l[i]**2
q.put(l)
def multithreading():
q =Queue()##定义队列
threads = []
data = [[1,2,3],[3,4,5],[4,4,4],[5,5,5]]
for i in range(4):##开启四个线程
t = threading.Thread(target=job,args=(data[i],q))##此处也要把定义的q传进去
t.start()
threads.append(t)
for thread in threads:## 等待四个线程全部结束
thread.join()
results = []
for _ in range(4):
results.append(q.get())#从队列中拿出数据
print(results)
线程锁
import threading
def job1():
global A,lock #定义使用全局变量
lock.acquire()#锁线程
for i in range(10):
A+=1
print('job1',A)
lock.release()#释放线程锁
def job2():
global A,lock #定义使用全局变量
lock.acquire()#锁线程
for i in range(10):
A+=10
print('job2',A)
lock.release()#释放线程锁
lock=threading.Lock()#定义进程锁(全局变量)
A=0
t1=threading.Thread(target=job1)
t2=threading.Thread(target=job2)
t1.start()
t2.start()
t1.join()
t2.join()