我的python随笔 - 一场针对线程的谋杀案

话说上次大佬(@天元浪子)发新书开直播的时候前去支持了一波,在直播中有一道题目很有意思:

尝试给一个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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值