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 相关文章推荐
easy_install python包安装管理工具介绍
Feb 10 Python
Python 异常处理实例详解
Mar 12 Python
python同时给两个收件人发送邮件的方法
Apr 30 Python
Python实现批量转换文件编码的方法
Jul 28 Python
Python获取当前公网ip并自动断开宽带连接实例代码
Jan 12 Python
解决安装pycharm后不能执行python脚本的问题
Jan 19 Python
pandas修改DataFrame列名的实现方法
Feb 22 Python
python字符串循环左移
Mar 08 Python
Python 利用高德地图api实现经纬度与地址的批量转换
Aug 14 Python
python @classmethod 的使用场合详解
Aug 23 Python
Python如何实现强制数据类型转换
Nov 22 Python
pytorch的梯度计算以及backward方法详解
Jan 10 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 输出URL的快捷方式示例代码
2013/09/22 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
Swoole4.4协程抢占式调度器详解
2019/05/23 PHP
laravel7学习之无限级分类的最新实现方法
2020/09/30 PHP
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
JavaScript闭包实例讲解
2014/04/22 Javascript
jQuery学习笔记之总体架构
2014/06/03 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
2015/04/01 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
微信小程序 textarea 详解及简单使用方法
2016/12/05 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
2017/08/25 Javascript
koa+jwt实现token验证与刷新功能
2019/05/30 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
2019/09/25 Javascript
使用JS监听键盘按下事件(keydown event)
2019/11/07 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
基于ant design日期控件使用_仅月份的操作
2020/10/27 Javascript
linux下安装easy_install的方法
2013/02/10 Python
在Python中操作列表之list.extend()方法的使用
2015/05/20 Python
解析Python中while true的使用
2015/10/13 Python
Python中functools模块函数解析
2017/03/12 Python
Python实现Linux中的du命令
2017/06/12 Python
Python中序列的修改、散列与切片详解
2017/08/27 Python
python 定时修改数据库的示例代码
2018/04/08 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
opencv python 2D直方图的示例代码
2018/07/20 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
2019/09/03 Python
python打印文件的前几行或最后几行教程
2020/02/13 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
2020/12/27 Python
小学教师培训方案
2014/06/09 职场文书
写给老师的感谢信
2015/01/20 职场文书
西湖英语导游词
2015/02/06 职场文书
2015年乡镇纪检工作总结
2015/04/22 职场文书
检讨书怎么写?
2019/06/21 职场文书
Spring Boot 实现敏感词及特殊字符过滤处理
2021/06/29 Java/Android
python超详细实现完整学生成绩管理系统
2022/03/17 Python
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js