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的lambda匿名函数的简单介绍
Apr 25 Python
详解Python如何获取列表(List)的中位数
Aug 12 Python
python difflib模块示例讲解
Sep 13 Python
给你选择Python语言实现机器学习算法的三大理由
Nov 15 Python
python实现kNN算法
Dec 20 Python
介绍一款python类型检查工具pyright(推荐)
Jul 03 Python
用python爬取历史天气数据的方法示例
Dec 30 Python
django ORM之values和annotate使用详解
May 19 Python
Keras load_model 导入错误的解决方式
Jun 09 Python
使用keras实现孪生网络中的权值共享教程
Jun 11 Python
python 匿名函数与三元运算学习笔记
Oct 23 Python
Python加密与解密模块hashlib与hmac
Jun 05 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 输出双引号"与单引号'的方法
2010/05/09 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
php定时计划任务的实现方法详解
2013/06/06 PHP
PHP CURL与java http使用方法详解
2018/01/26 PHP
Aster vs Newbee BO3 第二场2.18
2021/03/10 DOTA
将jQuery应用于login页面的问题及解决
2009/10/17 Javascript
JS实现图片翻书效果示例代码
2013/09/09 Javascript
JavaScript Math 对象常用方法总结
2016/04/28 Javascript
jQuery实现区域打印功能代码详解
2016/06/17 Javascript
jQuery调用Webservice传递json数组的方法
2016/08/06 Javascript
js中 计算两个日期间的工作日的简单实例
2016/08/08 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
JS实现可编辑的后台管理菜单功能【附demo源码下载】
2016/09/13 Javascript
jQuery图片切换动画特效
2016/11/02 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
2017/01/24 Javascript
js中如何完美的解析数据
2018/03/18 Javascript
详解ES6中的 Set Map 数据结构学习总结
2018/11/06 Javascript
使用 Element UI Table 的 slot-scope方法
2019/10/10 Javascript
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
python批量设置多个Excel文件页眉页脚的脚本
2018/03/14 Python
利用python的socket发送http(s)请求方法示例
2018/05/07 Python
Django实现文件上传下载功能
2019/10/06 Python
解决python 读取 log日志的编码问题
2019/12/24 Python
浅析Python中字符串的intern机制
2020/10/03 Python
python+selenium爬取微博热搜存入Mysql的实现方法
2021/01/27 Python
英国Boots旗下太阳镜网站:Boots Designer Sunglasses
2018/07/07 全球购物
制定岗位职责的原则
2013/11/08 职场文书
kfc实习自我鉴定
2013/12/14 职场文书
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
大学生自我鉴定评语
2014/01/27 职场文书
班长自荐书范文
2014/02/11 职场文书
我的未来不是梦演讲稿
2014/09/02 职场文书
体育教师个人工作总结
2015/02/09 职场文书
工会工作个人总结
2015/03/03 职场文书
小学生运动会广播
2015/08/19 职场文书
quickjs 封装 JavaScript 沙箱详情
2021/11/02 Javascript