Python程序暂停的正常处理方法

 更新时间:2019年11月07日 11:13:35   作者:Mein_Augenstern  
这篇文章主要介绍了Python程序暂停的实现代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

将进程挂起(Suspend) 而非 阻塞(Block)

如果用sleep() 进程将阻塞

假设进程下有两个线程 那么这两个线程会继续运行

要使进程挂起 可以考虑使用psutil

import psutil
p = psutil.Process(pid)
p.suspend()  #挂起进程
p.resume()  #恢复进程

为了证明效果 我写了一个简单的进程Process
其下有两个线程 读者Reader 和 写者Writer(简单的读者写者问题)


Process:
import threading
from time import ctime, sleep
import ThreadInReadAndWriteProblem
import multiprocessing
import os
class Process(multiprocessing.Process):  
  def __init__(self):
    multiprocessing.Process.__init__(self) #手动实现父类
    pid = os.getpid()
  def run(self):
    print '当前运行进程PID : %s ' %self.pid  #子线程的id与父进程的pid相同 属于 同一个进程
    for i in range(0,5):
      r = ThreadInReadAndWriteProblem.Reader()
      w = ThreadInReadAndWriteProblem.Writer()
      w.start()
      r.start()
 print '进程阻塞'
    sleep(10)  #总共运行时间10秒
Reader&Writer
import threading
from time import ctime, sleep
import os
mutex = threading.Lock()  #互斥锁 
mutex_readercount = threading.Lock() #计数时的互斥 计算当前正在读的数目
readerCount = 0 number = 0
#不满足条件的 进入阻塞状态
class Reader(threading.Thread):    #读者
  def __init__(self):
    threading.Thread.__init__(self) #继承父类构造函数
  def run(self):
    global mutex
    global readerCount
    #print '线程PID: %s ' %os.getpid()
    while True:
       mutex_readercount.acquire()
       readerCount +=1
       if readerCount == 1:
         print '读者进程等待中,编号%s' %(self.name)
         mutex.acquire() == False   # 第一个需要申请
       mutex_readercount.release()
       print '开始读 , 读者编号 %s ,现在时间是 %s' %(self.name,ctime())
       sleep(2)
       print '完成读 , 读者编号 %s , 现在时间是 %s' %(self.name,ctime())
       mutex_readercount.acquire()
       readerCount -= 1
       if readerCount == 0:  #所有读者均完成
          print '最后一个读者完成读 '
          mutex.release()
       mutex_readercount.release()
class Writer(threading.Thread):   #写者
  def __init__(self):
    threading.Thread.__init__(self)
  def run(self):
    global mutex
    global writerCount
    #print '线程PID: %s' %os.getpid()
    while True:
      print '写者进程等待中 编号: %s' %(self.name)
      mutex.acquire()       
      print '开始写 编号:%s 现在时间是: %s ' %(self.name,ctime())
      sleep(5)
      print '结束写 编号: %s 现在时间是 %s' %(self.name,ctime())
      mutex.release()

测试程序

import ThreadInReadAndWriteProblem
import SingleProcessSchedulerMultiprocess
import psutil
import Scheduler
from time import ctime, sleep
def main():
  p = SingleProcessSchedulerMultiprocess.Process()
  p.start()
  sleep(3)
  stop(p.pid)
  print '进程挂起 %s' %ctime()
  sleep(5)
  wake(p.pid)
  print '唤醒进程 %s' %ctime()
def stop(pid):
    print '进程暂停 进程编号 %s ' %(pid)
    p = psutil.Process(pid)
    p.suspend()
def wake(pid):
    print '进程恢复 进程编号 %s ' %(pid)
    p = psutil.Process(pid)
    p.resume()
if __name__ == '__main__':
  main()

结果:

当前运行进程PID : 3096
写者进程等待中 编号: Thread-2
开始写 编号:Thread-2 现在时间是: Mon Nov 30 21:12:12 2015
读者进程等待中,编号Thread-1
写者进程等待中 编号: Thread-4
进程阻塞
写者进程等待中 编号: Thread-6
写者进程等待中 编号: Thread-8
写者进程等待中 编号: Thread-10
进程暂停 进程编号 3096
进程挂起 Mon Nov 30 21:12:15 2015
进程恢复 进程编号 3096
唤醒进程 Mon Nov 30 21:12:20 2015
结束写 编号: Thread-2 现在时间是 Mon Nov 30 21:12:20 2015
写者进程等待中 编号: Thread-2
开始读 , 读者编号 Thread-1 ,现在时间是 Mon Nov 30 21:12:20 2015
开始读 , 读者编号 Thread-3 ,现在时间是 Mon Nov 30 21:12:20 2015
开始读 , 读者编号 Thread-5 ,现在时间是 Mon Nov 30 21:12:20 2015
开始读 , 读者编号 Thread-7 ,现在时间是 Mon Nov 30 21:12:20 2015
开始读 , 读者编号 Thread-9 ,现在时间是 Mon Nov 30 21:12:20 2015
完成读 , 读者编号 Thread-1 , 现在时间是 Mon Nov 30 21:12:22 2015
完成读 , 读者编号 Thread-3 , 现在时间是 Mon Nov 30 21:12:22 2015
完成读 , 读者编号 Thread-5 , 现在时间是 Mon Nov 30 21:12:22 2015
完成读 , 读者编号 Thread-7 , 现在时间是 Mon Nov 30 21:12:22 2015

总结

以上所述是小编给大家介绍的Python程序暂停的正常处理方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

  • Python与shell的3种交互方式介绍

    Python与shell的3种交互方式介绍

    这篇文章主要介绍了Python与shell的3种交互方式介绍,本文讲解了os.system、os.popen、subprocess模块等3种方法,需要的朋友可以参考下
    2015-04-04
  • python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)

    python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)

    这篇文章主要介绍了python爬虫beautifulsoup库使用操作全解(python爬虫基础入门),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Python使用matplotlib绘制动画的方法

    Python使用matplotlib绘制动画的方法

    这篇文章主要介绍了Python使用matplotlib绘制动画的方法,涉及matplotlib模块的常见使用技巧,需要的朋友可以参考下
    2015-05-05
  • python鼠标绘图附代码

    python鼠标绘图附代码

    这篇文章主要为大家介绍了python鼠标绘图的实现完整示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • python实现批量获取指定文件夹下的所有文件的厂商信息

    python实现批量获取指定文件夹下的所有文件的厂商信息

    这篇文章主要介绍了python实现批量获取指定文件夹下的所有文件的厂商信息的方法,是非常实用的技巧,涉及到文件的读写与字典的操作等技巧,需要的朋友可以参考下
    2014-09-09
  • 浅谈Tensorflow2对GPU内存的分配策略

    浅谈Tensorflow2对GPU内存的分配策略

    本文主要介绍了Tensorflow2对GPU内存的分配策略,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 从安装到应用全面掌握Python与OpenCV的配置与高级功能(最新推荐)

    从安装到应用全面掌握Python与OpenCV的配置与高级功能(最新推荐)

    OpenCV的强大功能不仅限于基本的图像处理,还可以扩展到实时视频分析、复杂的图像拼接和特征匹配等应用场景,这篇文章主要介绍了从安装到应用全面掌握Python与OpenCV的配置与高级功能,需要的朋友可以参考下
    2024-08-08
  • 在CentOS6上安装Python2.7的解决方法

    在CentOS6上安装Python2.7的解决方法

    在CentOS6上yum安装工具是基于Python2.6.6的,所以在CentOS6上默认安装的是Python2.6.6,因为要在服务器系统为CentOS6上部署生产环境,但是代码都是基于Python2.7写的,所有遇到了问题,下面通过本文给大家介绍下在CentOS6上安装Python2.7的解决方法,一起看看吧
    2018-01-01
  • Python multiprocessing多进程原理与应用示例

    Python multiprocessing多进程原理与应用示例

    这篇文章主要介绍了Python multiprocessing多进程原理与应用,结合实例形式详细分析了基于multiprocessing包的多进程概念、原理及相关使用操作技巧,需要的朋友可以参考下
    2019-02-02
  • Python使用日志模块快速调试代码并记录异常信息

    Python使用日志模块快速调试代码并记录异常信息

    本文详细介绍了Python logging日志模块的使用方法,包括如何在代码中使用logging记录调试信息、如何设置日志级别、如何记录异常信息等。通过本文的指南,读者可以快速学会如何使用logging模块进行调试,并保留有用的日志信息,便于后续排查问题和优化代码
    2023-04-04

最新评论