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 break语句详解
Mar 11 Python
在Gnumeric下使用Python脚本操作表格的教程
Apr 14 Python
用Python进行行为驱动开发的入门教程
Apr 23 Python
python Django框架实现自定义表单提交
Mar 25 Python
深入理解Python单元测试unittest的使用示例
Nov 18 Python
Python数据拟合与广义线性回归算法学习
Dec 22 Python
用tensorflow构建线性回归模型的示例代码
Mar 05 Python
python django框架中使用FastDFS分布式文件系统的安装方法
Jun 10 Python
通过celery异步处理一个查询任务的完整代码
Nov 19 Python
python对Excel的读取的示例代码
Feb 14 Python
python help函数实例用法
Dec 06 Python
基于Python实现股票收益率分析
Apr 02 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
在laravel中实现事务回滚的方法
2019/10/10 PHP
响应鼠标变换表格背景或者颜色的代码
2009/03/30 Javascript
JavaScript学习笔记(十七)js 优化
2010/02/04 Javascript
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
js性能优化技巧
2015/11/29 Javascript
bootstrap实现图片自动轮播
2016/12/21 Javascript
ES6新特性二:Iterator(遍历器)和for-of循环详解
2017/04/20 Javascript
jquery.form.js异步提交表单详解
2017/04/25 jQuery
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
通过一个简单的例子学会vuex与模块化
2017/11/22 Javascript
webpack中使用iconfont字体图标的方法
2018/02/22 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
Js视频播放器插件Video.js使用方法详解
2020/02/04 Javascript
JavaScript数组常用的增删改查与其他属性详解
2020/10/13 Javascript
如何利用JavaScript编写一个格斗小游戏
2021/01/06 Javascript
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
Python3指定路径寻找符合匹配模式文件
2015/05/22 Python
Django中间件实现拦截器的方法
2018/06/01 Python
Python将json文件写入ES数据库的方法
2019/04/10 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
2019/06/17 Python
Python中断多重循环的思路总结
2019/10/04 Python
Python开发之pip安装及使用方法详解
2020/02/21 Python
在pytorch中动态调整优化器的学习率方式
2020/06/24 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
python从Oracle读取数据生成图表
2020/10/14 Python
如何用python开发Zeroc Ice应用
2021/01/29 Python
海淘零差价,宝贝全球购: 宝贝格子
2016/08/24 全球购物
GNC健安喜官方海外旗舰店:美国著名保健品牌
2017/01/04 全球购物
WatchShop法国:英国排名第一的独立手表零售商
2020/02/17 全球购物
高级技校毕业生自荐信
2013/11/18 职场文书
清华大学自主招生自荐信
2014/01/29 职场文书
小学母亲节活动方案
2014/03/14 职场文书
小学五年级学生评语
2014/04/22 职场文书
导游词之天津古文化街
2019/11/09 职场文书