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对比C语言的编程思想差异
Aug 30 Python
Python爬虫爬取美剧网站的实现代码
Sep 03 Python
Python探索之ModelForm代码详解
Oct 26 Python
Django csrf 验证问题的实现
Oct 09 Python
在Python中获取两数相除的商和余数方法
Nov 10 Python
django基于restframework的CBV封装详解
Aug 08 Python
python中通过selenium简单操作及元素定位知识点总结
Sep 10 Python
python求质数列表的例子
Nov 24 Python
flask框架自定义url转换器操作详解
Jan 25 Python
如何使用Cython对python代码进行加密
Jul 08 Python
python如何删除列为空的行
Jul 17 Python
如何用用Python将地址标记在地图上
Feb 07 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采集相关教程之一 CURL函数库
2010/02/15 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
2014/02/02 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
PHP7中I/O模型内核剖析详解
2019/04/14 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
响应鼠标变换表格背景或者颜色的代码
2009/03/30 Javascript
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
cloudgamer出品ImageZoom 图片放大效果
2010/04/01 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
JQuery扩展插件Validate—4设置错误提示的样式
2011/09/05 Javascript
js 可拖动列表实现代码
2011/12/13 Javascript
javascript实现图片切换的幻灯片效果源代码
2012/12/12 Javascript
javascript检测页面是否缩放的小例子
2013/05/16 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
2016/05/27 Javascript
ES6扩展运算符的用途实例详解
2017/08/20 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
基于iview的router常用控制方式
2019/05/30 Javascript
NodeJS 文件夹拷贝以及删除功能
2019/09/03 NodeJs
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
python里dict变成list实例方法
2019/06/26 Python
python下的opencv画矩形和文字注释的实现方法
2019/07/09 Python
Python 实现遥感影像波段组合的示例代码
2019/08/04 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
HTML5实现获取地理位置信息并定位功能
2015/04/25 HTML / CSS
KIKO美国官网:意大利的平价彩妆品牌
2017/05/16 全球购物
Stührling手表官方网站:男女高品质时尚手表的领先零售商
2021/01/07 全球购物
医学院校毕业生自荐信范文
2014/01/01 职场文书
幼儿园毕业典礼主持词
2014/03/21 职场文书
2016自主招生教师推荐信范文
2015/03/23 职场文书
Python opencv缺陷检测的实现及问题解决
2021/04/24 Python
Nginx如何配置根据路径转发详解
2022/07/23 Servers