Python中如何在一段时间后停止程序

Python中如何在一段时间后停止程序,第1张

用到threading的Timer,也类似单片机那样子,在中断程序中再重置定时器,设置中断,python实例代码如下:

import threading

import time

def change_user():

  print('这是中断,切换账号')

  t = threadingTimer(3, change_user)

  tstart()

#每过3秒切换一次账号

t = threadingTimer(3, change_user)

tstart()

while True:

  print('我在爬数据')

  timesleep(1)

扩展资料

有时当一个条件成立的情况下,需要终止程序,可以使用sysexit()退出程序。sysexit()会引发一个异常:

1、如果这个异常没有被捕获,那么python编译器将会退出,后面的程序将不会执行。

2、如果这个异常被捕获(tryexceptfinally),捕获这个异常可以做一些额外的清理工作,后面的程序还会继续执行。

注:0为正常退出,其他数值(1-127)为不正常,可抛异常事件供捕获。另一种终止程序的方法os_exit()

一般情况下使用sysexit()即可,一般在fork出来的子进程中使用os_exit()

采用sysexit(0)正常终止程序,程序终止后shell运行不受影响。

采用os_exit(0)关闭整个shell,调用sys_exit(0)后整个shell都重启了(RESTART Shell)。

Python提供了非常好用的多进程包multiprocessing,你只需要定义一个函数,Python会替你完成其他所有事情。

借助这个包,可以轻松完成从单进程到并发执行的转换。

1、新建单一进程

如果我们新建少量进程,可以如下:

import multiprocessing

import time

def func(msg):

for i in xrange(3):

print msg

timesleep(1)

if __name__ == "__main__":

p = multiprocessingProcess(target=func, args=("hello", ))

pstart()

pjoin()

print "Sub-process done"12345678910111213

2、使用进程池

是的,你没有看错,不是线程池。它可以让你跑满多核CPU,而且使用方法非常简单。

注意要用apply_async,如果落下async,就变成阻塞版本了。

processes=4是最多并发进程数量。

import multiprocessing

import time

def func(msg):

for i in xrange(3):

print msg

timesleep(1)

if __name__ == "__main__":

pool = multiprocessingPool(processes=4)

for i in xrange(10):

msg = "hello %d" %(i)

poolapply_async(func, (msg, ))

poolclose()

pooljoin()

print "Sub-process(es) done"12345678910111213141516

3、使用Pool,并需要关注结果

更多的时候,我们不仅需要多进程执行,还需要关注每个进程的执行结果,如下:

import multiprocessing

import time

def func(msg):

for i in xrange(3):

print msg

timesleep(1)

return "done " + msg

if __name__ == "__main__":

pool = multiprocessingPool(processes=4)

result = []

for i in xrange(10):

msg = "hello %d" %(i)

resultappend(poolapply_async(func, (msg, )))

poolclose()

pooljoin()

for res in result:

print resget()

print "Sub-process(es) done"1234567891011121314151617181920

20141225更新

根据网友评论中的反馈,在Windows下运行有可能崩溃(开启了一大堆新窗口、进程),可以通过如下调用来解决:

multiprocessingfreeze_support()1

附录(自己的脚本):

#!/usr/bin/python

import threading

import subprocess

import datetime

import multiprocessing

def dd_test(round, th):

test_file_arg = 'of=/zbkc/test_mds_crash/1m_%s_%s_{}' %(round, th)

command = "seq 100 | xargs -i dd if=/dev/zero %s bs=1M count=1" %test_file_arg

print command

subprocesscall(command,shell=True,stdout=open('/dev/null','w'),stderr=subprocessSTDOUT)

def mds_stat(round):

p = subprocessPopen("zbkc mds stat", shell = True, stdout = subprocessPIPE)

out = pstdoutreadlines()

if out[0]find('active') != -1:

command = "echo '0205pm %s round mds status OK, %s' >> /round_record" %(round, datetimedatetimenow())

command_2 = "time (ls /zbkc/test_mds_crash/) 2>>/round_record"

command_3 = "ls /zbkc/test_mds_crash | wc -l >> /round_record"

subprocesscall(command,shell=True)

subprocesscall(command_2,shell=True)

subprocesscall(command_3,shell=True)

return 1

else:

command = "echo '0205 %s round mds status abnormal, %s, %s' >> /round_record" %(round, out[0], datetimedatetimenow())

subprocesscall(command,shell=True)

return 0

#threads = []

for round in range(1, 1600):

pool = multiprocessingPool(processes = 10) #使用进程池

for th in range(10):

# th_name = "thread-" + str(th)

# threadsappend(th_name) #添加线程到线程列表

# threadingThread(target = dd_test, args = (round, th), name = th_name)start() #创建多线程任务

poolapply_async(dd_test, (round, th))

poolclose()

pooljoin()

#等待线程完成

# for t in threads:

# tjoin()

if mds_stat(round) == 0:

subprocesscall("zbkc -s",shell=True)

break

创建 socket 对象,监听地址

while True: serversocketaccept() 不断接收请求

conn 其实就是 socket 对象,接受到请求之后,connrecv(1024) 不断拼接出 request,然后解析 request

connsend(response), connclose() 响应请求,关掉

能同时响应多个请求是因为把 handler 部分新增线程来处理

在 socketaccept() 之后,把 handle_connection() 放到线程处理。

以上就是关于Python中如何在一段时间后停止程序全部的内容,包括:Python中如何在一段时间后停止程序、python 进程池当一个进程报错时,别的进程有影响吗、pythonsocket服务端响应多个返回等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10090082.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存