设为首页 收藏本站
查看: 1570|回复: 0

[经验分享] python的学习(九)----多线程编程(2)

[复制链接]

尚未签到

发表于 2015-10-26 12:32:49 | 显示全部楼层 |阅读模式
  多线程编程(2)


  目前Python的lib中对多线程编程提供两种启动方法,一种是比较基本的thread模块中start_new_thread方法,在线程中运行一个函数, 另一种是使用集成threading模块的线程对象Thread类。
  目前所用到的,是旧版本中调用thread模块中的start_new_thread()函数来产生新的线程


  相比而言,thread.start_new_thread(function,(args[,kwargs]))实现机制其实与C更为类似,其中function参数是将要调用的线程函数;(args[,kwargs])是将传递给待创建线程函数的参数组成的元组类型,其中kwargs是可选的参数。新创建的线程结束一般依靠线程函数的执行结束自动退出,或者在线程函数中调用thread.exit()抛出SystemExit exception, 达到线程退出的目的。
  

print "=======================thread.start_new_thread启动线程============="  
import thread  
#Python的线程sleep方法并不是在thread模块中,反而是在time模块下  
import time  
def inthread(no,interval):  
count=0  
while count<10:  
print &quot;Thread-%d,休眠间隔:%d,current Time:%s&quot;%(no,interval,time.ctime())  
#使当前线程休眠指定时间,interval为浮点型的秒数,不同于Java中的整形毫秒数  
time.sleep(interval)  
#Python不像大多数高级语言一样支持++操作符,只能用+=实现  
count+=1  
else:  
print &quot;Thread-%d is over&quot;%no  
#可以等待线程被PVM回收,或主动调用exit或exit_thread方法结束线程  
thread.exit_thread()  
#使用start_new_thread函数可以简单的启动一个线程,第一个参数指定线程中执行的函数,第二个参数为元组型的传递给指定函数的参数值  
thread.start_new_thread(inthread,(1,2))  
#线程执行时必须添加这一行,并且sleep的时间必须足够使线程结束,如本例  
#如果休眠时间改为20,将可能会抛出异常  
time.sleep(30)  
'''  
使用这种方法启动线程时,有可能出现异常  
  Unhandled exception in thread started by

Error in sys.excepthook:

Original exception was:

解决:启动线程之后,须确保主线程等待所有子线程返回结果后再退出,如果主线程比子线程早结束,无论其子线程是否是后台线程,都将会中断,抛出这个异常

            若没有响应阻塞等待,为避免主线程提前退出,必须调用time.sleep使主线程休眠足够长的时间,另外也可以采用加锁机制来避免类&#20284;情况,通过在启动线程的时候,给每个线程都加了一把锁,直到线程运行介绍,再释放这个锁。同时在Python的main线程中用一个while循环来不停的判断每个线程锁已释放


  

    import thread;  
from time import sleep,ctime;  
from random import choice  
#The first param means the thread number  
#The second param means how long it sleep  
#The third param means the Lock  
def loop(nloop,sec,lock):  
print &quot;Thread &quot;,nloop,&quot; start and will sleep &quot;,sec;  
sleep(sec);  
print &quot;Thread &quot;,nloop,&quot; end  &quot;,sec;  
lock.release();  
def main():  
seconds=[4,2];  
locks=[];  
for i in range(len(seconds)) :  
lock=thread.allocate_lock();  
lock.acquire();  
locks.append(lock);  
print &quot;main Thread begins:&quot;,ctime();  
for i,lock in enumerate(locks):  
thread.start_new_thread(loop,(i,choice(seconds),lock));  
for lock in locks :  
while lock.locked() :   
pass;  
print &quot;main Thread ends:&quot;,ctime();  
if __name__==&quot;__main__&quot; :  
main();  

很多介绍说在新python版本中推荐使用Threading模块,目前暂没有应用到。。。
  

版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-130960-1-1.html 上篇帖子: Python模块学习 ---- thread 多线程处理 下篇帖子: Python连接MySQL数据库通信实例以及中文乱码的解决办法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表