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多线程爬虫简单示例
Mar 04 Python
Python中使用装饰器来优化尾递归的示例
Jun 18 Python
Python实现读取文件最后n行的方法
Feb 23 Python
Python中matplotlib中文乱码解决办法
May 12 Python
python数字图像处理之高级形态学处理
Apr 27 Python
python3实现点餐系统
Jan 24 Python
python selenium爬取斗鱼所有直播房间信息过程详解
Aug 09 Python
Python socket模块ftp传输文件过程解析
Nov 05 Python
python海龟绘图之画国旗实例代码
Nov 11 Python
Python Selenium库的基本使用教程
Jan 04 Python
删除pycharm鼠标右键快捷键打开项目的操作
Jan 16 Python
Python批量将csv文件转化成xml文件的实例
May 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获取Google AJAX Search API 数据的代码
2010/03/12 PHP
JS判断不能为空实例代码
2013/11/26 Javascript
javascript计算用户打开网页的停留时间
2014/01/09 Javascript
Node.js中创建和管理外部进程详解
2014/08/16 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
2016/06/02 Javascript
js 颜色选择插件
2017/01/23 Javascript
最常用的jQuery表单验证(简单)
2017/05/23 jQuery
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
jQuery实现页码跳转式动态数据分页
2017/12/31 jQuery
微信小程序日历效果
2018/12/29 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
如何在 ant 的table中实现图片的渲染操作
2020/10/28 Javascript
python使用cookie库操保存cookie详解
2014/03/03 Python
wxpython学习笔记(推荐查看)
2014/06/09 Python
Python正则捕获操作示例
2017/08/19 Python
django实现同一个ip十分钟内只能注册一次的实例
2017/11/03 Python
python脚本作为Windows服务启动代码详解
2018/02/11 Python
在Python中实现shuffle给列表洗牌
2018/11/08 Python
使用Django2快速开发Web项目的详细步骤
2019/01/06 Python
Python中捕获键盘的方式详解
2019/03/28 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
postman传递当前时间戳实例详解
2019/09/14 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
NumPy中的维度Axis详解
2019/11/26 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
2020/01/25 Python
如何解决tensorflow恢复模型的特定值时出错
2020/02/06 Python
python 6种方法实现单例模式
2020/12/15 Python
python爬虫破解字体加密案例详解
2021/03/02 Python
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
电子商务专业实习生自我鉴定
2013/09/24 职场文书
群众路线教育实践活动的心得体会
2014/09/03 职场文书
领导批评与自我批评范文
2014/10/16 职场文书
师德师风个人整改措施
2014/10/27 职场文书
群众路线专项整治工作情况报告
2014/10/28 职场文书
退休欢送会致辞
2015/07/31 职场文书
保护环境建议书作文400字
2015/09/14 职场文书