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冒泡排序算法的实现代码
Nov 21 Python
python采用getopt解析命令行输入参数实例
Sep 30 Python
python+selenium识别验证码并登录的示例代码
Dec 21 Python
python 多线程重启方法
Feb 18 Python
python从list列表中选出一个数和其对应的坐标方法
Jul 20 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
Aug 17 Python
django实现支付宝支付实例讲解
Oct 17 Python
pytorch 自定义卷积核进行卷积操作方式
Dec 30 Python
详解python polyscope库的安装和例程
Nov 13 Python
Django实现简单的分页功能
Feb 22 Python
OpenCV-Python使用cv2实现傅里叶变换
Jun 09 Python
Golang Web 框架Iris安装部署
Aug 14 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
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
PHP设计模式之调解者模式的深入解析
2013/06/13 PHP
PHP捕获Fatal error错误的方法
2014/06/11 PHP
js中的window.open返回object的错误的解决方法
2009/08/15 Javascript
xml文档转换工具,附图表例子(hta)
2010/11/17 Javascript
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
JavaScript获取并更改input标签name属性的方法
2015/07/02 Javascript
使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法
2015/09/16 Javascript
Bootstrap每天必学之折叠(Collapse)插件
2016/04/25 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
2018/05/17 Javascript
详解vue-loader在项目中是如何配置的
2018/06/04 Javascript
浅谈React碰到v-if
2018/11/04 Javascript
vue中使用v-model完成组件间的通信
2019/08/22 Javascript
Vue中的循环及修改差值表达式的方法
2019/08/29 Javascript
在Vue项目中使用Typescript的实现
2019/12/19 Javascript
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
python中函数传参详解
2016/07/03 Python
快速了解Python开发中的cookie及简单代码示例
2018/01/17 Python
python实现拼图小游戏
2020/02/22 Python
django的模型类管理器——数据库操作的封装详解
2020/04/01 Python
Python实现邮件发送的详细设置方法(遇到问题)
2021/01/18 Python
意大利咖啡、浓缩咖啡和浓缩咖啡机:illy caffe
2019/03/20 全球购物
仓库班组长岗位职责
2013/12/12 职场文书
《一个中国孩子的呼声》教学反思
2014/02/12 职场文书
网络编辑求职信
2014/04/30 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
尊老爱亲美德少年事迹材料
2014/08/14 职场文书
庆六一活动总结
2014/08/29 职场文书
2014年个人师德工作总结
2014/12/04 职场文书
优秀党员推荐材料
2014/12/18 职场文书
病危通知书样本
2015/04/17 职场文书
加薪通知
2015/04/25 职场文书
工作年限证明模板
2015/06/15 职场文书
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS
SQL解决未能删除约束问题drop constraint
2022/05/30 SQL Server