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

[经验分享] Python多线程学习-壹-threading

[复制链接]

尚未签到

发表于 2017-5-1 11:44:51 | 显示全部楼层 |阅读模式
Python多线程学习-threading

 

想学习python多线程,可以直接看官网http://docs.python.org/2/library/threading.html
         Python的文档真心是值得称赞的,不过你如果不想看英文,直接向入门python多线程,本文可以作为你快速入门的捷径。
先打开python command端口,输入
 

import threading
 Ok,如果没有什么输出,那么就是import成功了。
根据学习的过程并且你如果看过上一篇文章的话,先来下dir命令
 

dir(threading)
BoundedSemaphore
Condition
Event
Lock
RLock
Semaphore
Thread
ThreadError
Timer
   这些是threading包提供的一些多线程模块,看到其中的Thread,有没有感觉很眼熟。
这个Thread对于Java的同学来说是个福音,因为使用这个Thread和Java没有什么不同,至少思路一致。
对于threading模块的这些模块,我们后面都会讲到


threading包除了这些模块外,还提供了一些方法,
 
 

threading.enumerate()
返回当前存活的Thread列表
threading.active_count()
threading.activeCount()
返回当前的依然存活的Thread数量,实际上就是enumerate()返回的长度
threading.current_thread()
threading.current_Thread()
返回当前的线程,根据调用线程的不同返回不同值
threading.local
表示thread-local量,Thread-Local数据是跟Thread相关的

 上面这些都是和threading包的内容,实际是保存了当前main thread的宏观信息,明白这个就好。


 
下面我们来学习Thread模块,按照惯例,执行dir命令
 

dir(threading.Thread)
daemon
getName
ident
isAlive
isDaemon
is_alive
join
name
run
setDaemon
setName
start
 
 
  可以看到,Thread有几个重要的属性,daemon、name、alive、ident
  daemon:这个参数很关键。在调用start前设置改值,默认主线程创建的子线程都是False,表示主线程必须等子线程完成才能退出;如果为True的话,主线程退出导致子线程立即退出,根据自己的应用场景设置合适的True或者False。
  name:thread name
  alive:ture or false
  ident:identity
  

        看到run和join方法了吗?这个有没有很熟悉。下面我们来看下通过继承threading.Thread 来创建线程的方法。

#!/usr/bin/python
import threading
import time
class my_thread(threading.Thread):
def __init__(self,threadname,interval):
threading.Thread.__init__(self,name=threadname)
self.interval=interval
def run(self):
print dir(self)
for i in range(10):
print self.getName,i
time.sleep(self.interval)

if __name__ == "__main__":
mythread=my_thread("thread one",3)
mythread2=my_thread("thread two",5)
mythread.start()
mythread2.start()
   下面我们再看下用另一种方法来创建线程的方法

#!/usr/bin/python
import threading
import time
def run(interval):
for i in range(5):
print threading.current_thread().getName(),i
time.sleep(interval)

if __name__ == "__main__":
for i in range(3):
threading.Thread(target=run,args=[5],name='thread-' + str(i)).start()
   对于这种方法创建的线程,我们看下init函数:
 


def __init__(self, group=None, target=None, name=None, args=(), kwargs={})
  group:预留
  target:是一个可调用对象(也称为活动[activity]),在线程启动后执行;
  name:是线程的名字。默认值为“Thread-N“,N是一个数字。
  args和kwargs:表示调用target时的参数列表和关键字参数。
 

  看使用方法,应该是使用第一种更为方便
  

  我们先看下daemon的用法:

import threading
import datetime
from time import sleep
import sys
class threadclass(threading.Thread):
def run(self):
print self.daemon
for i in range(10):
now=datetime.datetime.now()
print "%s says hello world at  time:%s" %(self.getName(),now)
sleep(1)
if __name__ == "__main__":
t=threadclass();
t.daemon=True
t.start()
sleep(5)
sys.exit(0)
 
 

可以看到执行了五次后就退出了,主线程推出子线程也就退出了。

可以再将t.daemon=True注掉后再运行一下,对比下结果。



 

关于join的用法,如果在主线程中调用这个方法,会等子线程执行完成后主线程才会退出来。

这个join用法和daemon参数是有冲突的,不过一般不会同时设置daemon参数和调用join方法



有了Thread结构,后面的工作就很简单啦。



下面我们再看下threading.Timer的用法。

 


#!/usr/bin/python
import threading
import time
def run():
print "hello word";
if __name__ == "__main__":
t=threading.Timer(5.0,run)
t.start()
 
 

Timer的用法比较简单,就是设定一个时间点interval,等到时间间隔到了后,执行function

并没有想你想象的那么大的功能,如Java的Timer、Quartz的Scheduler等。

这个Timer的功能从初始化函数可以看出来:

 

 


def __init__(self, interval, function, args=[], kwargs={}):
interval:时间间隔
function:执行函数
args、kwargs:函数执行参数
 
 

 

本节我们学习了Thread、Timer两个模型,下节课我们学习别的内容

 

 

 

运维网声明 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-371584-1-1.html 上篇帖子: python 获取指定目录的属主 下篇帖子: python核心编程学习笔记-执行环境
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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