python -- 多线程基础

声明 – python的多进程并不是真正的并行(GIL)

python里因为有GIL的存在
所以python在同一时刻只允许一个线程进行运算
但python的多线程还是会节省下来IO的时间(IO时将执行权限交给下一个线程)
/-----------------------------------------------------------------------/
感谢评论里老哥的提醒,python有多种解释器版本,如cpython(c语言实现)、Jython(java语言实现)等。具体可以看https://blog.csdn.net/orangleliu/article/details/39204897

在cpython中存在GIL,大家可以尝试其他解释器版本,可能就不会存在GIL了

添加线程

引入所需要的库

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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值