问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求助python多线程,执行到100多个停止了

发布网友 发布时间:2022-04-28 15:31

我来回答

4个回答

懂视网 时间:2022-05-10 13:21

python 线程 暂停, 恢复, 退出

我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦start后, 线程就属于失控状态. 不过, 我们可以自己实现这些. 一般的方法就是循环地判断一个标志位, 一旦标志位到达到预定的值, 就退出循环. 这样就能做到退出线程了. 但暂停和恢复线程就有点难了, 我一直也不清除有什么好的方法, 直到我看到threading中Event对象的wait方法的描述时.

wait([timeout])

 Block until the internal flag is true. If the internal flag is true on entry, return immediately. Otherwise, block until another thread calls set() to set the flag to true, or until the optional timeout occurs.

 阻塞, 直到内部的标志位为True时. 如果在内部的标志位在进入时为True时, 立即返回. 否则, 阻塞直到其他线程调用set()方法将标准位设为True, 或者到达了可选的timeout时间.

 When the timeout argument is present and not None, it should be a floating point number specifying a timeout for the operation in seconds (or fractions thereof).

 This method returns the internal flag on exit, so it will always return True except if a timeout is given and the operation times out.

 当给定了timeout参数且不为None, 它应该是一个浮点数,以秒为单位指定操作的超时(或是分数)。

 此方法在退出时返回内部标志,因此除非给定了超时且操作超时,否则它将始终返回True。

 Changed in version 2.7: Previously, the method always returned None.

 2.7版本以前, 这个方法总会返回None.



  利用wait的阻塞机制, 就能够实现暂停和恢复了, 再配合循环判断标识位, 就能实现退出了, 下面是代码示例:

#!/usr/bin/env python
# coding: utf-8

import threading
import time

class Job(threading.Thread):

 def __init__(self, *args, **kwargs):
 super(Job, self).__init__(*args, **kwargs)
 self.__flag = threading.Event() # 用于暂停线程的标识
 self.__flag.set() # 设置为True
 self.__running = threading.Event() # 用于停止线程的标识
 self.__running.set() # 将running设置为True

 def run(self):
 while self.__running.isSet():
 self.__flag.wait() # 为True时立即返回, 为False时阻塞直到内部的标识位为True后返回
 print time.time()
 time.sleep(1)

 def pause(self):
 self.__flag.clear() # 设置为False, 让线程阻塞

 def resume(self):
 self.__flag.set() # 设置为True, 让线程停止阻塞

 def stop(self):
 self.__flag.set() # 将线程从暂停状态恢复, 如何已经暂停的话
 self.__running.clear() # 设置为False



下面是测试代码:

a = Job()
a.start()
time.sleep(3)
a.pause()
time.sleep(3)
a.resume()
time.sleep(3)
a.pause()
time.sleep(2)
a.stop()



测试的结果:




  这完成了暂停, 恢复和停止的功能. 但是这里有一个缺点: 无论是暂停还是停止, 都不是瞬时的, 必须等待run函数内部的运行到达标志位判断时才有效. 也就是说操作会滞后一次.

  但是这有时也不一定是坏事. 如果run函数中涉及了文件操作或数据库操作等, 完整地运行一次后再退出, 反而能够执行剩余的资源释放操作的代码(例如各种close). 不会出现程序的文件操作符超出上限, 数据库连接未释放等尴尬的情况.

-->

热心网友 时间:2022-05-10 10:29

  python 线程 暂停, 恢复, 退出
  我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦start后, 线程就属于失控状态. 不过, 我们可以自己实现这些. 一般的方法就是循环地判断一个标志位, 一旦标志位到达到预定的值, 就退出循环. 这样就能做到退出线程了. 但暂停和恢复线程就有点难了, 我一直也不清除有什么好的方法, 直到我看到threading中Event对象的wait方法的描述时.  
  wait([timeout])
  Block until the internal flag is true. If the internal flag is true on entry, return immediately. Otherwise, block until another thread calls set() to set the flag to true, or until the optional timeout occurs.
  阻塞, 直到内部的标志位为True时. 如果在内部的标志位在进入时为True时, 立即返回. 否则, 阻塞直到其他线程调用set()方法将标准位设为True, 或者到达了可选的timeout时间.
  When the timeout argument is present and not None, it should be a floating point number specifying a timeout for the operation in seconds (or fractions thereof).
  This method returns the internal flag on exit, so it will always return True except if a timeout is given and the operation times out.
  当给定了timeout参数且不为None, 它应该是一个浮点数,以秒为单位指定操作的超时(或是分数)。
  此方法在退出时返回内部标志,因此除非给定了超时且操作超时,否则它将始终返回True。
  Changed in version 2.7: Previously, the method always returned None.
  2.7版本以前, 这个方法总会返回None.
  <br>
  利用wait的阻塞机制, 就能够实现暂停和恢复了, 再配合循环判断标识位, 就能实现退出了, 下面是代码示例:
  #!/usr/bin/env python
  # coding: utf-8
  import threading
  import time
  class Job(threading.Thread):
  def __init__(self, *args, **kwargs):
  super(Job, self).__init__(*args, **kwargs)
  self.__flag = threading.Event() # 用于暂停线程的标识
  self.__flag.set() # 设置为True
  self.__running = threading.Event() # 用于停止线程的标识
  self.__running.set() # 将running设置为True
  def run(self):
  while self.__running.isSet():
  self.__flag.wait() # 为True时立即返回, 为False时阻塞直到内部的标识位为True后返回
  print time.time()
  time.sleep(1)
  def pause(self):
  self.__flag.clear() # 设置为False, 让线程阻塞
  def resume(self):
  self.__flag.set() # 设置为True, 让线程停止阻塞
  def stop(self):
  self.__flag.set() # 将线程从暂停状态恢复, 如何已经暂停的话
  self.__running.clear() # 设置为False
  下面是测试代码:
  a = Job()
  a.start()
  time.sleep(3)
  a.pause()
  time.sleep(3)
  a.resume()
  time.sleep(3)
  a.pause()
  time.sleep(2)
  a.stop()
  <br>
  测试的结果:
  这完成了暂停, 恢复和停止的功能. 但是这里有一个缺点: 无论是暂停还是停止, 都不是瞬时的, 必须等待run函数内部的运行到达标志位判断时才有效. 也就是说操作会滞后一次.
  但是这有时也不一定是坏事. 如果run函数中涉及了文件操作或数据库操作等, 完整地运行一次后再退出, 反而能够执行剩余的资源释放操作的代码(例如各种close). 不会出现程序的文件操作符超出上限, 数据库连接未释放等尴尬的情况.

热心网友 时间:2022-05-10 11:47

可以设置加锁的全局变量等于你的线程数,在线程运行的最后这个变量减一,然后起线程的程序判断这个变量值为0了就可以下次循环

热心网友 时间:2022-05-10 13:21

貌似你的第五个线程执行 挂起操作,这导致无法释放锁资源。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 笔记本电脑屏幕开机锁忘记密码 怎么办?急死了 华硕笔记本电脑开机密码忘记了怎样找回?系统是Windows 7旗舰版... 红米Note3手机进水该怎么办 python 多进程读取同一个循环处理、可以用multiprocessing python多线程怎么用啊,多线程的话是不是能节约时间啊? 红米note3进水了怎么拆电池 python 中多线程总运行时间的统计 红米手机进水开不了机,卸了电池晾晒一会打不开,不知是不是主板烧了,我想把它拆了,拆不了,怎摸拆? python 循环中使用多线程 python多线程中为什么要用for遍历所有线程然后依次调用join python for 怎么多线程 陀螺怎么玩 辐射4旋转机枪是自动武器吗 Unity3d粒子发射器怎样才能随着物体旋转移动,同时有拖尾 maya粒子系统体积发射器怎么设置只沿一个方向发射,我调了diretion x diretion y怎么都没有效果 Unity3d粒子发射器怎样才能随着物体旋转移动,同时有拖尾。 假面骑士fourze中所有的开关的图片 一个开关一张图 俄罗斯“短号”反坦克导弹系统的发射装置 世界上几个国家海军掌握了军舰垂直发射导弹技术??? 在unity3d粒子系统里面,怎么让mesh片面模型或者圆柱形模型围绕发射器旋转。(如果我粒子速度 旋转式激光雷达原理? 迷你世界怎怎么做旋转大炮 红米手机进水了,怎么办才能修好? 如何多线程(多进程)加速while循环(语言-python)? 红米note3掉水里了,怎么办? 红米手机掉水里开不了机怎么办? 红米note3进水了,无法开机,维修费大概要多少 红米手机一不小心掉地上了进水了能修好吗?得多少钱 怎么看微信图片 CAD坐标交汇处的W什么意思? win10更新了之后 lol进入游戏选好英雄之后就崩溃,之后一直进不去怎么... CAD中命令B和W有什么区别? win10专业版lol无法加载怎么解决? 求助,刚更新了win10 就不能玩lol cad弱点图例符号制作W标志是什么意思 电脑更新成win10,为什么打LOL进不去 CAD室内施工图的各种符合都代表什么意思,例如M,E,W……谁可以给解释下 电脑升级到win10LOL怎么玩不了了我win8就可以玩 有哪位大佬知道cad尺寸里面T、H、W、CH各表示什么 这是怎么回事,升级了win10就这样了lol打不开 天津三日游推荐哪些景点 天津三日游路线攻略 今天电脑升级到了Win10,LOL就打不开了!如图,一直黑屏。