python多线程threading

碎碎念

在学习python的多线程之前我一直很纳闷多线程有什么用?毕竟学习一门东西你知道了它的用途了之后就更加有动力去学习它

  1. 然后我去了解了它的优点有以下几个: 使用线程可以把占据长时间的程序中的任务放到后台去处理。

  2. 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。

  3. 程序的运行速度可能加快

  4. 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

  5. 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

  6. and so on

掌握threading几个重点命令

  1. threading.active_count() #获取已激活的线程数
  2. threading.enumerate() #查看所有线程信息
  3. threading.Thread(target=thread_job, name=‘T1’) #这里的target是指线程函数,等于后面可以为一个定义好的函数def。name是线程名字,还有其他参数arg,group
  4. added_thread.start() #added_thread线程工作
  5. added_thread.join() #join让added_thread线程执行完毕在执行其他的线程,起到一个控制流程顺序的作用
time模块在线程中的作用

import time
time.sleep(0.1) #任务间隔0.1s并且sleep让线程进入休眠状态,没有join当前线程无法执行

queue在多线程中的作用

from queue import Queue

def fun(l,q):
    for i in range (len(l)):
        l[i] = l[i]**2
    q.put(l)   #多线程调用的函数不是用return返回值
def multithreading():
    q =Queue()    #q中存放返回值,代替return的返回值
    threads = []
    data = [[1,2,3],[3,4,5],[7,7,7],[8,8,8]]
    # 在多线程函数中定义四个线程,启动线程,将每个线程添加到多线程的列表中

    for i in range(4):   #定义四个线程
        t = threading.Thread(target=job,args=(data[i],q)) 
    #Thread首字母要大写,被调用的job函数没有括号,只是一个索引,参数在后面
        t.start()#开始线程
        threads.append(t) #把每个线程append到线程列表中
    
    
    
    
    # 分别join四个线程到主线程
    for thread in threads:
        thread.join()
    
    # 定义一个空的列表results,将四个线运行后保存在队列中的结果返回给空列表results
    results = []
    for _ in range(4):
          results.append(q.get())#获取得到的返回值
    print(results)
if __name__ == '__main__':
    multithreading()

输出结果为[[1, 4, 9], [9, 16, 25], [49,49,49], [64,64,64]]

lock锁

#全局变量A的值每次加1,循环10次,并打印
def job1():  
    global A,lock  #lock锁
    lock.acquire() # 加锁
    for i in range(10):
        A+=1
        print('job1',A)
    lock.release()

    
#函数二:全局变量A的值每次加10,循环10次,并打印    
def job2():
    global A,lock
    lock.acquire()  # 加锁
    for i in range(10):
        A+=10
        print('job2',A)
    lock.release()
  
    
    #主函数:定义两个线程,分别执行函数一和函数二    
if __name__== '__main__':
    lock=threading.Lock()
    A=0
    t1=threading.Thread(target=job1)
    t2=threading.Thread(target=job2)
    t1.start()
    t2.start()
    t1.join()
    t2.join()

lock的作用以及使用方法

  1. lock在不同线程使用同一共享内存时,能够确保线程之间互不影响,使用lock的方法是
  2. 在每个线程执行运算修改共享内存之前,执行lock.acquire()将共享内存上锁
  3. 确保当前线程执行时,内存不会被其他线程访问,执行运算完毕后
  4. 使用lock.release()将锁打开, 保证其他的线程可以使用该共享内存

lock和join的区别

join在上面例子的使用

import threading
def job1():
   global A
   for i in range(10):
       A+=1
       print('job1',A)
       
def job2():
   global A
   for i in range(10):
       A+=10
       print('job2',A)

if __name__ == "__main__":
   A=0
   t1=threading.Thread(target=job1)
   t2=threading.Thread(target=job2)
   t1.start()
   t2.start()
   t1.join()
   t2.join()
   print('done')

join的结果

job1 1
job1 2
job1 3
job1 4
job1 5
job1 6
job1 7
job1 8
job1job2  19
job2 29
job2 39
job2 499
job1 50

job2 60
job2 70
job2 80
job2 90
job2 100
job2 110
done

lock的运行结果如下

job1 1
job1 2
job1 3
job1 4
job1 5
job1 6
job1 7
job1 8
job1 9
job1 10
job2 20
job2 30
job2 40
job2 50
job2 60
job2 70
job2 80
job2 90
job2 100
job2 110

== 讨论两者的区别==
1.join()并不能阻止各个线程互相干涉,就像例子里运行的结果的一样。
2.使用lock()使得线程只能一个一个进行,数据独立不共享。

参考文章如下,感谢~:

Python多线程中join()和lock()的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值