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用于url解码和中文解析的小脚本(python url decoder)
Aug 11 Python
Python实现的Kmeans++算法实例
Apr 26 Python
Python中的类学习笔记
Sep 23 Python
分享Python开发中要注意的十个小贴士
Aug 30 Python
python+unittest+requests实现接口自动化的方法
Nov 29 Python
Python实现带参数的用户验证功能装饰器示例
Dec 14 Python
Python 70行代码实现简单算式计算器解析
Aug 30 Python
Python用input输入列表的实例代码
Feb 07 Python
pycharm第三方库安装失败的问题及解决经验分享
May 09 Python
Django model重写save方法及update踩坑详解
Jul 27 Python
Python爬取微信小程序通用方法代码实例详解
Sep 29 Python
Python自动化之批量处理工作簿和工作表
Jun 03 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中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
PHP按行读取文件时删除换行符的3种方法
2014/05/04 PHP
php修改指定文件后缀的方法
2014/09/11 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
2017/02/05 PHP
PHP关于foreach复制知识点总结
2019/01/28 PHP
PHP封装的简单连接MongoDB类示例
2019/02/13 PHP
javascript 兼容FF的onmouseenter和onmouseleave的代码
2008/07/19 Javascript
js获得参数的getParameter使用示例
2014/02/26 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
2016/01/27 Javascript
JSON字符串和对象相互转换实例分析
2016/06/16 Javascript
浅谈js中StringBuffer类的实现方法及使用
2016/09/02 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
2019/08/20 Javascript
jQuery实现穿梭框效果
2021/01/19 jQuery
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
[33:39]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第二局
2016/02/27 DOTA
python中的reduce内建函数使用方法指南
2014/08/31 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
python爬虫获取百度首页内容教学
2018/12/23 Python
如何基于线程池提升request模块效率
2020/04/18 Python
Python3开发环境搭建详细教程
2020/06/18 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
HTML5新增加标签和功能概述
2016/09/05 HTML / CSS
安纳塔拉酒店度假村及水疗官方网站:Anantara Hotel
2016/08/25 全球购物
阿玛尼化妆品美国官网:Giorgio Armani Beauty
2017/02/02 全球购物
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
Dr. Martens马汀博士法国官网:马丁靴鼻祖
2020/01/15 全球购物
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
会计系毕业个人自荐信格式
2013/09/23 职场文书
电气技术员岗位职责
2013/11/19 职场文书
大学生职业生涯规划范文——找准自我,定位人生
2014/01/23 职场文书
学雷锋活动总结范文
2014/04/25 职场文书
小学秋季运动会通讯稿
2015/11/25 职场文书
基于Python的EasyGUI学习实践
2021/05/07 Python
Redis数据结构之链表与字典的使用
2021/05/11 Redis