Python程序暂停的正常处理方法
将进程挂起(Suspend)而非阻塞(Block)
如果用sleep()进程将阻塞
假设进程下有两个线程那么这两个线程会继续运行
要使进程挂起可以考虑使用psutil
importpsutil p=psutil.Process(pid) p.suspend()#挂起进程 p.resume()#恢复进程
为了证明效果我写了一个简单的进程Process
其下有两个线程读者Reader和写者Writer(简单的读者写者问题)
Process: importthreading fromtimeimportctime,sleep importThreadInReadAndWriteProblem importmultiprocessing importos classProcess(multiprocessing.Process): def__init__(self): multiprocessing.Process.__init__(self)#手动实现父类 pid=os.getpid() defrun(self): print'当前运行进程PID:%s'%self.pid#子线程的id与父进程的pid相同属于同一个进程 foriinrange(0,5): r=ThreadInReadAndWriteProblem.Reader() w=ThreadInReadAndWriteProblem.Writer() w.start() r.start() print'进程阻塞' sleep(10)#总共运行时间10秒 Reader&Writer importthreading fromtimeimportctime,sleep importos mutex=threading.Lock()#互斥锁 mutex_readercount=threading.Lock()#计数时的互斥计算当前正在读的数目 readerCount=0number=0 #不满足条件的进入阻塞状态 classReader(threading.Thread):#读者 def__init__(self): threading.Thread.__init__(self)#继承父类构造函数 defrun(self): globalmutex globalreaderCount #print'线程PID:%s'%os.getpid() whileTrue: mutex_readercount.acquire() readerCount+=1 ifreaderCount==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 ifreaderCount==0:#所有读者均完成 print'最后一个读者完成读' mutex.release() mutex_readercount.release() classWriter(threading.Thread):#写者 def__init__(self): threading.Thread.__init__(self) defrun(self): globalmutex globalwriterCount #print'线程PID:%s'%os.getpid() whileTrue: print'写者进程等待中编号:%s'%(self.name) mutex.acquire() print'开始写编号:%s现在时间是:%s'%(self.name,ctime()) sleep(5) print'结束写编号:%s现在时间是%s'%(self.name,ctime()) mutex.release()
测试程序
importThreadInReadAndWriteProblem importSingleProcessSchedulerMultiprocess importpsutil importScheduler fromtimeimportctime,sleep defmain(): p=SingleProcessSchedulerMultiprocess.Process() p.start() sleep(3) stop(p.pid) print'进程挂起%s'%ctime() sleep(5) wake(p.pid) print'唤醒进程%s'%ctime() defstop(pid): print'进程暂停进程编号%s'%(pid) p=psutil.Process(pid) p.suspend() defwake(pid): print'进程恢复进程编号%s'%(pid) p=psutil.Process(pid) p.resume() if__name__=='__main__': main()
结果:
当前运行进程PID:3096
写者进程等待中编号:Thread-2
开始写编号:Thread-2现在时间是:MonNov3021:12:122015
读者进程等待中,编号Thread-1
写者进程等待中编号:Thread-4
进程阻塞
写者进程等待中编号:Thread-6
写者进程等待中编号:Thread-8
写者进程等待中编号:Thread-10
进程暂停进程编号3096
进程挂起MonNov3021:12:152015
进程恢复进程编号3096
唤醒进程MonNov3021:12:202015
结束写编号:Thread-2现在时间是MonNov3021:12:202015
写者进程等待中编号:Thread-2
开始读,读者编号Thread-1,现在时间是MonNov3021:12:202015
开始读,读者编号Thread-3,现在时间是MonNov3021:12:202015
开始读,读者编号Thread-5,现在时间是MonNov3021:12:202015
开始读,读者编号Thread-7,现在时间是MonNov3021:12:202015
开始读,读者编号Thread-9,现在时间是MonNov3021:12:202015
完成读,读者编号Thread-1,现在时间是MonNov3021:12:222015
完成读,读者编号Thread-3,现在时间是MonNov3021:12:222015
完成读,读者编号Thread-5,现在时间是MonNov3021:12:222015
完成读,读者编号Thread-7,现在时间是MonNov3021:12:222015
总结
以上所述是小编给大家介绍的Python程序暂停的正常处理方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。