python 线程超时设置_Python实现多线程同步!(实例:Event、RLock、Semaphore等)

前言:

这篇文章主要介绍了Python多线程同步Lock、RLock、Semaphore、Event实例,Lock & RLock 用来确保多线程多共享资源的访问,Semaphore用来确保一定资源多线程访问时的上限,Event是最简单的线程间通信的方式,需要的朋友可以参考下(部分代码以图片的方式呈现出来,方便各位观看与收藏)

一、多线程同步

由于CPython的python解释器在单线程模式下执行,所以导致python的多线程在很多的时候并不能很好地发挥多核cpu的资源。大部分情况都推荐使用多进程。

python的多线程的同步与其他语言基本相同,主要包含:

Lock & RLock :用来确保多线程多共享资源的访问。

Semaphore : 用来确保一定资源多线程访问时的上限,例如资源池。

Event : 是最简单的线程间通信的方式,一个线程可以发送信号,其他的线程接收到信号后执行操作。

二、实例

1. Lock & RLock

Lock对象的状态可以为locked和unlocked

使用acquire()设置为locked状态;

使用release()设置为unlocked状态。

如果当前的状态为unlocked,则acquire()会将状态改为locked然后立即返回。当状态为locked的时候,acquire()将被阻塞直到另一个线程中调用release()来将状态改为unlocked,然后acquire()才可以再次将状态置为locked。

Lock.acquire(blocking=True, timeout=-1),blocking参数表示是否阻塞当前线程等待,timeout表示阻塞时的等待时间 。如果成功地获得lock,则acquire()函数返回True,否则返回False,timeout超时时如果还没有获得lock仍然返回False。

实例:(确保只有一个线程可以访问共享资源)

6c807f7613aef52f1c8f6aa0e5485914.png

结果:

bc251ba79e34b210d9e367ec826d2192.png

RLock与Lock的区别是:RLock中除了状态locked和unlocked外还记录了当前lock的owner和递归层数,使得RLock可以被同一个线程多次acquire()。

2. Semaphore

Semaphore管理一个内置的计数器,

每当调用acquire()时内置计数器-1;

调用release() 时内置计数器+1;

计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。

实例:(同时只有2个线程可以获得semaphore,即可以限制最大连接数为2):

e9b439f89e40c52470170459d9290b18.png

结果:

363c68607a21024fb402e7d44c825f7d.png

3. Event

Event内部包含了一个标志位,初始的时候为false。

可以使用使用set()来将其设置为true;

或者使用clear()将其从新设置为false;

可以使用is_set()来检查标志位的状态;

另一个最重要的函数就是wait(timeout=None),用来阻塞当前线程,直到event的内部标志位被设置为true或者timeout超时。如果内部标志位为true则wait()函数理解返回。

实例: (线程间相互通信)

7e32504e2ec2d4dc8dc2699e3ccdd7a9.png

图一

图一与图二是一起的
5ded45f953a5ba1c5c9b9f5e90e344f7.png

图二

运行结果:

c87d0100732a1313bc1a0edeb84b528b.png

三、其他

1) 线程局部变量

线程局部变量的值是跟线程相关的,区别与全局的变量。使用非常简单如下:

mydata = threading.local()mydata.x = 1

2)对Lock,semaphore,condition等使用with关键字代替手动调用acquire()和release()。

以上就是本文全部内容啦!

最后,小编想说一句话:我是一名python开发工程师,整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习,面试宝典,面试宝典,面试宝典。想要这些资料的可以关注小编,并在后台私信小编:“07”即可领取



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于Python多线程超时问题,有几种常见的解决方案: 1. 使用`threading.Timer`:可以使用`threading.Timer`类来设置线程超时时间。您可以在启动线程之前创建一个定时器,并在指定时间后触发超时操作。例如: ```python import threading def my_function(): # 线程执行的代码 # 设置超时时间为5秒 timeout = 5 # 创建定时器 timer = threading.Timer(timeout, thread_timeout) # 启动定时器 timer.start() # 启动线程 thread = threading.Thread(target=my_function) thread.start() # 等待线程执行完成 thread.join() # 如果线程超时时间内未完成,则执行超时操作 if thread.is_alive(): # 执行超时操作 ``` 2. 使用`concurrent.futures`模块:`concurrent.futures`模块提供了一个高级的接口来管理并发任务。您可以使用`ThreadPoolExecutor`类来创建一个线程池,并使用`submit`方法提交任务。可以使用`as_completed`函数来迭代已完成的任务,并设置超时时间。例如: ```python import concurrent.futures def my_function(): # 线程执行的代码 # 设置超时时间为5秒 timeout = 5 # 创建线程池 executor = concurrent.futures.ThreadPoolExecutor() # 提交任务 future = executor.submit(my_function) # 等待任务完成,设置超时时间 try: result = future.result(timeout=timeout) except concurrent.futures.TimeoutError: # 执行超时操作 ``` 这些方法可以帮助您在Python中处理多线程超时问题。根据您的具体需求,可以选择适合您的方法来实现超时控制。希望能对您有所帮助!如果您有任何疑问,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值