话说上次大佬(@天元浪子)发新书开直播的时候前去支持了一波,在直播中有一道题目很有意思:
尝试给一个input函数计时,如果用户在十秒内输入参数则显示参数,超过十秒那就关闭输入渠道,或者干脆说就不让输了。
嗯…一看到十秒倒计时那第一反应就是time模块了(废话)。得,先写上呗。
import time
那接下来就是比较麻烦的一个情况,我既需要程序一边检测并等待用户借助input输入字符,另一方面还需要程序自己给自己掐一个10秒钟的秒表,唉?!多进程?!
那来呗,import走起!
import multiprocessing
然后尝试写了两个函数,一个是显示input输入:
def action():
"""用户输入模块"""
s = input('输入参数:')
print(s)
另一个就掐时间呗:
def timeOut():
"""杀死进程模块"""
time.sleep(10)
"""此处等待杀死上面那个函数嘿嘿嘿"""
然后就是考虑A进程启动后得到一个进程编号(PID),然后B进程拿到这个进程编号开始计时,时间一到,按照这个编号干它:
import multiprocessing
import os
import time
def action():
"""用户输入模块"""
s = input('输入参数:')
print(s)
def timeOut():
"""杀死进程模块"""
time.sleep(10)
"""此处等待杀死上面那个函数嘿嘿嘿"""
os.popen('taskkill.exe /pid:' + str(os.getppid()))
"""需要说明一下,为了省事,我也不拿另一个进程的pid了,直接稳赚狠拿了父进程pid,一窝端"""
if __name__ == '__main__':
mp1 = multiprocessing.Process(target=action)
mp1.start()
mp2 = multiprocessing.Process(target=timeOut)
mp2.start()
啪一下就写完了,很快啊!运行!!!
啪叽!!!
艹(一种植物)!!!!怎么这么红?!
原来!!!
进程不支持input函数!!!
不支持input函数!!!
input函数!!!
函数!!!
嗯…
嘿嘿嘿我是傻子嘿嘿嘿…
——————————————————————————————————————
吃完药之后,我决定换个方式,进程拉倒,那就线程:
import threading
早知道一开始就用线程了,你看这个模块名字就短不少(误)。
但是问题是,线程间不能通信,那我怎么才能让一个线程到点了把另一个线程带走呢???
那就是————开守护线程!
守护线程这名字听着高大上,其实说白了,就是给某个或者某些线程加个daemon参数。
你比如说t1是个线程,那只要在开始这个线程之前,这样子:
t1.daemon = True
那这个线程就是守护线程了。
那这个线程开了守护能干啥呢,你可以这么理解:
比如一个程序由多个线程组成,那么程序整体结束的标准是参照所有【非守护】线程是否结束。换句话说,当所有【非守护】线程结束的时候,程序就直接啪叽结束了,那些还在运行的守护线程咋办呢,直接强行结束。
…名字好听,还守护线程,就是备胎线程呗。
奇怪,我怎么突然就悟了???
——————————————————————————————————————
哭完之后,把这个程序写出来了:
import threading
import time
def action():
s = input('输入参数>>> ')
print(s)
def timeOut():
time.sleep(10)
print('time out!')
if __name__ == '__main__':
t1 = threading.Thread(target=action)
t2 = threading.Thread(target=timeOut)
t1.daemon = True
t1.start()
t2.start()
本来故事到这里就能结束了,上面这个答案也能算得上是一个标准答案。
但是
备胎这个词不好(明明叫守护!),而且既然整个程序就俩线程,那么只要在倒计时结束的时候直接强行拉闸,那什么线程都要玩完,本着完(bu)美(dang)结(bei)局(tai)的想法,考虑了一下如何才能直接用python关闭当前整个程序,艾?还真可以:
import os
于是,暴力拉闸版本就整出来了:
import threading
import time
import os
def action():
s = input('输入参数>>> ')
print(s)
def timeOut():
time.sleep(10)
print('time out!')
os._exit(0)
if __name__ == '__main__':
t1 = threading.Thread(target=action)
t2 = threading.Thread(target=timeOut)
t1.start()
t2.start()