python中的多线程

本文介绍了Python中线程的join()方法和lock()的使用,讲解了它们在控制线程执行顺序和避免数据竞争中的作用。join()用于等待线程完成,而lock()则用于保护共享资源的访问,确保线程安全。通过示例展示了在没有锁的情况下,多线程对全局变量操作导致的数据混乱,以及使用lock后的正确同步效果。
摘要由CSDN通过智能技术生成

join()使用方法:
使用join对控制多个线程的执行顺序非常关键。
(更多控制的是,线程和非线程之间的执行顺序,对于多个线程的控制顺序一般用lock)
def thread_job():
print(‘T1 start\n’)
for i in range(10):
time.sleep(0.1)
print(‘T1 finish\n’)
add_thread=threading.Thread(target=thread_job,name=‘T1’)
add_thread.start()
add_thread.join() #用来控制,当T1这个任务执行完之后,才能进行其他的任务。
print(‘all done\n’)

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

join和lock的区别:

join()表示要堵塞主线程直到这个线程完成,并不影响子线程的同时进行,只是代表在join()后边的语句必须等待join的这个线程完成才能执行:join()并不能阻止各个线程互相干涉。
lock()则表示要阻止线程同时访问相同的共享数据来防止线程相互干扰,所以线程只能一个一个执行,不能同时进行。使用lock()使得线程只能一个一个进行。

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

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,输出的可能是

job1

job2 11
job2 21
job2 31
job2 41
job2 51
job2 61
job2 71
job2 81
job2 91
job2 101
job1 102
job1 103
job1 104
job1 105
job1 106
job1 107
job1 108
job1 109
job1 110

加上lock之后,会在执行完join1之后,才会执行join2

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

莫烦多线程教程:https://mofanpy.com/tutorials/python-basic/threading/lock/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值