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


Posted in Python onNovember 07, 2019

将进程挂起(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 相关文章推荐
python益智游戏计算汉诺塔问题示例
Mar 05 Python
Python实现全角半角转换的方法
Aug 18 Python
python定时复制远程文件夹中所有文件
Apr 30 Python
余弦相似性计算及python代码实现过程解析
Sep 18 Python
Django 自动生成api接口文档教程
Nov 19 Python
Django2 连接MySQL及model测试实例分析
Dec 10 Python
tensorflow 只恢复部分模型参数的实例
Jan 06 Python
Python3 shelve对象持久存储原理详解
Mar 23 Python
使用keras实现孪生网络中的权值共享教程
Jun 11 Python
利用python中的matplotlib打印混淆矩阵实例
Jun 16 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
Jan 22 Python
Pycharm 如何一键加引号的方法步骤
Feb 05 Python
浅析python redis的连接及相关操作
Nov 07 #Python
大家都说好用的Python命令行库click的使用
Nov 07 #Python
flask 实现token机制的示例代码
Nov 07 #Python
python3反转字符串的3种方法(小结)
Nov 07 #Python
Python中__repr__和__str__区别详解
Nov 07 #Python
Python通过Manager方式实现多个无关联进程共享数据的实现
Nov 07 #Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
Nov 07 #Python
You might like
php代码优化及php相关问题总结
2006/10/09 PHP
php 魔术方法使用说明
2009/10/20 PHP
PHP imagecreatefrombmp 从BMP文件或URL新建一图像
2012/07/16 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
php上传文件中文文件名乱码的解决方法
2013/11/01 PHP
php生成扇形比例图实例
2013/11/06 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
2014/06/30 PHP
PHP生成图表pChart的示例解析
2020/07/31 PHP
JS 文件本身编码转换 图文教程
2009/10/12 Javascript
jQuery库与其他JS库冲突的解决办法
2010/02/07 Javascript
无阻塞加载脚本分析[全]
2011/01/20 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
2013/05/24 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
js 判断登录界面的账号密码是否为空
2017/02/08 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
2017/03/27 jQuery
关于Angular2 + node接口调试的解决方案
2017/05/28 Javascript
webpack之devtool详解
2018/02/10 Javascript
搭建vue开发环境
2018/07/19 Javascript
判断“命令按钮”是否被鼠标单击详解
2019/07/31 Javascript
Vue 动态组件components和v-once指令的实现
2019/08/30 Javascript
在layui中使用form表单监听ajax异步验证注册的实例
2019/09/03 Javascript
JavaScript 类的封装操作示例详解
2020/05/16 Javascript
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
使用Mixin设计模式进行Python编程的方法讲解
2016/06/21 Python
Python之reload流程实例代码解析
2018/01/29 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
PyTorch安装与基本使用详解
2020/08/31 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
Rakuten Kobo台湾:电子书、eReaders和Reading应用程式
2017/11/24 全球购物
大四自我鉴定
2014/02/08 职场文书
军训自我鉴定100字
2014/02/13 职场文书
身边的榜样活动方案
2014/08/20 职场文书
教师研修随笔感言
2015/11/18 职场文书