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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章