用到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服务端响应多个返回等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)