pythonif退出

1.如何控制python多线程的退出

相信用C/C++写过服务的同学对通过响应Ctrl-C(信号量SIG_TERM)实现多线程C进程的优雅退出都不会陌生,典型的实现伪码如下:#include int main(int argc, char * argv[]) {// 1. do some init work。

init() 。// 2. install signal handler, take SIGINT as example install:struct sigaction action;memset(&action, 0, sizeof(struct sigaction));action.sa_handler = term;sigaction(SIGTERM, &action, NULL);// 3. create thread(s)pthread_create(xxx);// 4. wait thread(s) to quitpthread_join(thrd_id);return 0;}主要步骤概括如下: 1)设置SIG_TERM信号量的处理函数 2)创建子线程 3)主线程通过pthread_join阻塞 4)主线程收到Ctrl-C对应的SIG_INT信号后,信号处理函数被调用,该函数通常会设置子线程的退出flag变量 5)子线程的spin-loop通常会检测flag变量,当flag指示退出时机已到时,子线程break其loop 6)待子线程释放资源退出后,主线程的pthread_join()结束阻塞返回,主线程退出,进程销毁然而,如果用Python多线程库(threading或thread)实现一个与上述伪码流程相似的多线程模块时,新手很容易犯错,导致进程启动后,Ctrl-C不起作用,甚至kill也结束不了进程,必须kill -9强杀才行。

下面用实例来说明。常见错误1:试图捕获Ctrl-C的KeyboardInterrupt异常实现进程退出,示例伪码如下:def main():try:thread1.start() thread1.join()except KeyboardInterrupt:print "Ctrl-c pressed 。

"sys.exit(1)123456789123456789上面的伪码在主线程中创建子线程后调用join主动阻塞,预期的行为是按下Ctrl-C时,进程能捕获到键盘中断异常。然而,根据python thread文档Caveats部分的说明,”Threads interact strangely with interrupts: the KeyboardInterrupt exception will be received by an arbitrary thread. (When the signal module is available, interrupts always Go to the main thread.)”,所以,上面伪码由于没有import signal模块,键盘中断只能由主线程接收,而主线程被thread.join()阻塞导致无法响应中断信号,最终的结果是进程无法通过Ctrl-C结束。

解决方法: 调用thread.join()时,传入timeout值并在spin-loop做isAlive检测,示例如下:def main():try:thread1.start()## thread is totally blocking e.g. while (1)while True:thread1.join(2)if not thread1.isAlive:breakexcept KeyboardInterrupt:print "Ctrl-c pressed 。"sys.exit(1)上面的方案可以实现用Ctrl-C退出进程的功能,不过,如Python Issue1167930中有人提到的,带timeout的join()调用会由于不断的polling带来额外的CUP开销。

常见错误2:注册SIG_INT或SIG_TERM信号处理函数,试图通过捕获Ctrl-C或kill对应的信号来销毁线程、退出主进程。示例如下:#/bin/env python#-*- encoding: utf-8 -*-import sysimport timeimport signalimport threadingdef signal_handler(sig, frame):g_log_inst.get().warn('Caught signal: %s, process quit now 。

', sig)sys.exit(0)def main():## install signal handler, for gracefully shutdownsignal.signal(signal.SIGTERM, signal_handler)signal.signal(signal.SIGINT, signal_handler)## start threadthrd = threading.Tread(target = thread_routine)thrd.start()## block主线程,否则主线程直接退出会导致其创建的子线程出现未定义行为## 具体可以参考python thread文档Caveats部分的说明。thrd.join()if '__main__' == __name__:main()如果运行上述伪码,你会发现Ctrl-C和kill均无法结束这个多线程的Python进程,那么,问题出在哪里呢?根据Python signal文档,我们需要牢记”Some general rules for working with signals and their handlers“,其中,跟本文最相关的第7条摘出如下:Some care must be taken if both signals and threads are used in the same program. The fundamental thing to remember in using signals and threads simultaneously is: always perform signal() operations in the main thread of execution. Any thread can perform an alarm(), getsignal(), pause(), setitimer() or getitimer(); only the main thread can set a new signal handler, and the main thread will be the only one to receive signals (this is enforced by the Python signal module, even if the underlying thread implementation supports sending signals to individual threads). This means that signals can't be used as a means of inter-thread communication. Use locks instead.如上所述,当signal和threading模块同时出现时,所有的信号处理函数都只能由主线程来设置,且所有的信号均只能由主线程来接收,而主线程调用thrd.join()后处于阻塞状态。

所以,Ctrl-C或kill不起作用的原因与前面列出的常见错误1类似,解决方法也类似,这里不赘述。

2.Python中条件成立就执行另一个py文件,怎么弄

运行python_a.py文件

python_a.py文件代码:

# -*- coding: utf-8 -*-

import python_b #引入所有

from python_b import class_b #引入其中一个类

# 调用一个函数

python_b.fun_b()

# 新建实例

cb = class_b()

cb.fun_c()python_b.py文件中代码:

# -*- coding: utf-8 -*-

def fun_b():

print('我被python_a调用了!')

class class_b():

def fun_c(self):

print('我被python_a调用了!')

3.Python完美数代码问题

root@localhost:~/xly/02# python r.py

[105, 108, 405, 1001, 1005, 1008, 2002, 2025, 3003, 4004, 4005, 5005, 6006, 6075, 7007, 8008, 9009]

root@localhost:~/xly/02# cat r.py

def computePerfectNumber(n):

k=''

if (n%10!=0):

for ch in list(str(n)):

if ch!='0':

k+=ch

if (n%int(k)==0) and (n!=int(k)):

return True

return False

alist=[]

for i in range(1,10000):

if computePerfectNumber(i):

alist.append(i)

print alist主要是因为if ch!='0': 你少了单引号

pythonif退出

转载请注明出处编程代码网 » pythonif退出

资讯

python退出python

阅读(46)

本文主要为您介绍python退出python,内容包括如何优雅地退出python程序,python为什么叫爬虫?,如何结束python程序。爬虫通常指的是网络爬虫,就是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。因为python的脚本特性,python易于配置,

资讯

Type在python

阅读(37)

本文主要为您介绍Type在python,内容包括python中type的用法,python为什么叫爬虫?,python的type是什么。爬虫通常指的是网络爬虫,就是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。因为python的脚本特性,python易于配置,对

资讯

splitpython

阅读(45)

本文主要为您介绍splitpython,内容包括Python中split()和split("")的区别,在python里面有个string.split,格式是strin?,Python常见文件如何操作?。str.split( ) 切割符默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。str.split(" ") 切割

资讯

pythonxpath与

阅读(49)

本文主要为您介绍pythonxpath与,内容包括如何在python中使用xpath,自学喜欢的python找工作好,还是去培训机构学出来找工作好?爱问知,Python爬虫好学吗?。在进行网页抓取的时候,分析定位html节点是获取抓取信息的关键,目前我用的是lxml模块(用

资讯

python.split

阅读(47)

本文主要为您介绍python.split,内容包括Python中split()和split("")的区别,在python里面有个string.split,格式是strin?,Python常见文件如何操作?。str.split( ) 切割符默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。str.split(" ") 切割

资讯

redisforpython

阅读(42)

本文主要为您介绍redisforpython,内容包括python用redis做什么功能,python用redis做什么功能,python用redis做什么功能。redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并

资讯

python车

阅读(43)

本文主要为您介绍python车,内容包括用python实现车牌号码自动识别,新手求教,想问下:python测试找哪家?,给孩子报编程的话,学Python怎么样?。大部分培训中心的课程的时间都是四个月或三个月,尚脑软件测试培训是960学时连续四个月的时间,周一至

资讯

pythonlinux安装

阅读(43)

本文主要为您介绍pythonlinux安装,内容包括python在linux系统怎么安装,Python在linux下运行的一个问题在windows下可以正,Linux问题1.请问我装了一个CentOS系统后,发现还有些组。linux下安装python3a、 准备编译环境(环境如果不对的话,可能遇

资讯

linux安装python

阅读(54)

本文主要为您介绍linux安装python,内容包括如何在linux系统中安装python?,Python在linux下运行的一个问题在windows下可以正,零基础学习python需要直接使用linux吗。1.下载源代码 http://www.python.org/ftp/python/2.5.2/Python-2.5.2.tar

资讯

idlepython

阅读(45)

本文主要为您介绍idlepython,内容包括python中的idle是如何运行的,python的IDLE是什么意思?,python编译环境IDLE的端口绑定错误当我打开Python的。使用ide集成开发环境会使开发效率大幅度提升。python中的ide有很多,vim,sublimetext,vscode

资讯

python字符串的替换字符

阅读(70)

本文主要为您介绍python字符串的替换字符,内容包括python怎么替换文件中字符串中的字符,python中文字符串替换字符?,Python中提到字符串是不可变的,但是字符串方法不就改变了字符串。在python中将列表转换为字符串的方法如下: 通过桌面快捷

资讯

逻辑与Python

阅读(68)

本文主要为您介绍逻辑与Python,内容包括我想问下python中逻辑与:“&”和“and”的区别,五年级如何学好Python,学习python需要什么必备的基础呢。“&”和“and”有本质区别,属于不同类型的运行符号。& 是位运算;and 是逻辑运算。 2、首先是&:该

资讯

python字符串的替换字符串

阅读(0)

本文主要为您介绍python字符串的替换字符串,内容包括python怎么替换文件中字符串中的字符,python字符串格式化什么意思,Python怎样用变量替换字符串。在python中也有类似于c中的printf()的格式输出标记。在python中格式化输出字符串使用的是

资讯

python文件编码

阅读(70)

本文主要为您介绍python文件编码,内容包括如何定义python源文件的文件编码,为什么python这些项目的代码规模会名列前茅?,python2.5文件读取问题在书上的实例代码:<br/>&lt。要写入的数据本身就是byte串(u中文是中文字符串,中文是byte串),用二进

资讯

python退出python

阅读(46)

本文主要为您介绍python退出python,内容包括如何优雅地退出python程序,python为什么叫爬虫?,如何结束python程序。爬虫通常指的是网络爬虫,就是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。因为python的脚本特性,python易于配置,

资讯

pythoniferror

阅读(63)

本文主要为您介绍pythoniferror,内容包括初学python,一个if语法错误请教条件中那个;起什么作用?,问IFERROR和if函数有什么区别,python学习之如何检测非法字符。在excel中使用iferror函数可以用来判断某些内容的正确与否,正确则返回正确结果,

资讯

pythonif判空

阅读(42)

本文主要为您介绍pythonif判空,内容包括python字符串相等if,python判断字符串是否为空用什么方法,python删除空文件夹问题,python中的intvar()的含义与stringvar()的区别。reaCode = Noneif ( reaCode == None ): print "is null"else : print

资讯

pythonifelseor

阅读(45)

本文主要为您介绍pythonifelseor,内容包括python,if语句用or作条件判断不执行else,python的ifelse简单问题,一个python编程题目——面向对象的。#coding=utf-8 __author__ = 14356_000 try: print 1 except: print 2 el

资讯

pythonifthenelse

阅读(41)

本文主要为您介绍pythonifthenelse,内容包括python的ifelse简单问题,pythonelseif怎么表示,python中for,continue如何使用。Python中用于多个选择, else if 用 elif表示。例如:123456789>>> x =3>>> ifx<1:print"

资讯

pythonif赋值

阅读(44)

本文主要为您介绍pythonif赋值,内容包括python中可以使用if作为变量名吗,python如何用if赋值,python随机问题,求解答。不可以,if为python保留的字符下面的列表显示了在 Python 中的保留字。这些保留字不能用作常数或变数,或任何其他标识符名

资讯

pythonifin

阅读(48)

本文主要为您介绍pythonifin,内容包括python中的ifin是什么意思,python中if和for语句的使用?,试编写Python程序,根据哥德巴赫猜想一:任何大于6的偶数都可表。if条件语句后面需要跟随bool类型的数据,即True或者False。然而,如果不是bool类型的

资讯

pythoniforelse

阅读(45)

本文主要为您介绍pythoniforelse,内容包括pythonelseif怎么表示,请教:orelse是什么意思啊?还有它的用法,python,if语句用or作条件判断不执行else。Python中用于多个选择, else if 用 elif表示。例如:123456789>>> x =3>>> ifx<1:print"