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 文件处理注意事项总结
Apr 10 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
May 03 Python
unittest+coverage单元测试代码覆盖操作实例详解
Apr 04 Python
python自动重试第三方包retrying模块的方法
Apr 24 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
Jun 14 Python
Python unittest 简单实现参数化的方法
Nov 30 Python
python使用time、datetime返回工作日列表实例代码
May 09 Python
python可视化篇之流式数据监控的实现
Aug 07 Python
提升python处理速度原理及方法实例
Dec 25 Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
Apr 03 Python
基于Python把网站域名解析成ip地址
May 25 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
德劲1104的电路分析与改良
2021/03/01 无线电
php 结果集的分页实现代码
2009/03/10 PHP
PHP制作万年历
2015/01/07 PHP
前端必学之PHP语法基础
2016/01/01 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
laravel异步监控定时调度器实例详解
2019/06/21 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
laravel5.6实现数值转换
2019/10/23 PHP
javascript 45种缓动效果 非常酷
2011/06/28 Javascript
jquery中ajax学习笔记4
2011/10/16 Javascript
Javascript 页面模板化很多人没有使用过的方法
2012/06/05 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
javascript:json数据的页面绑定示例代码
2014/01/26 Javascript
jQuery判断元素上是否绑定了指定事件的方法
2015/03/17 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
2015/09/17 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理
2015/11/24 Javascript
JavaScript中removeChild 方法开发示例代码
2016/08/15 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
jquery滚动条插件(可以自定义)
2016/12/11 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
JavaScript实现垂直滚动条效果
2017/01/18 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
2014/01/22 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
python运行其他程序的实现方法
2017/07/14 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
2018/06/11 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
Django 实现将图片转为Base64,然后使用json传输
2020/03/27 Python
python实现凯撒密码、凯撒加解密算法
2020/06/11 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
浅谈Html5移动端ios/Android兼容性总结
2018/06/01 HTML / CSS
行政专员岗位职责
2014/01/02 职场文书
中专生自我鉴定范文
2014/02/02 职场文书
浅谈redis缓存在项目中的使用
2021/05/20 Redis