python多线程学习

一、多线程介绍

http://python.jobbole.com/85050/

关于多线程的理解、多线程的创建,参考该博文,很好理解。

二、多线程的死锁问题

1* 官方文档翻译

threading---多线程并行

源代码:Lib/threading.py

这个模块构建了基于低级_thread模块的高级别的线程接口,参见queue模块。

dummy_threading模块是被用于由于_thread丢失导致threading不能使用的情况。

注意:除了下面列出的函数和方法,其他在python2系列中使用的符合驼峰命名法的函数和方法都仍然支持。

这个模块定义了下面的函数:

threading. active_count ( )
返回当前活动的Thread对象的数量,返回的数字等于enumerate()函数返回的列表长度。
threading. current_thread ()
返回当前的Thread对象,对应于调用者的控制线程,如果调用者的控制线程没有通过threading模块创建,将返回一个具有有限函数集的dummy thread对象。
threading. get_ident ( )
返回当前线程的线程标识符。这是一个非零整数。它的值没有直接含义,意在作为一个magic cookie,例如用于索引一个用于特定线程数据的字典。线程标识符将在一个线程退出同时另一个线程创建时被回收利用。
         New in version 3.3.
threading. enumerate ( )
返回一个当前正在活动的Thread对象列表。这个列表包括(daemonic threads)守护进程,被current_thread()创建的虚拟进程,以及主线程。不包括终止的线程和尚未start的线程。
threading. main_thread ( )
返回主线程对象。在正常情况下,主线程是Python解释器start的线程。
         New in version 3.4. threading. settrace ( func )
为所有从threading模块started的线程设置一个跟踪函数。对每个线程而言,这个函数将在线程的run()方法被调用前被传到sys.setprofile()中。
threading. setprofile ( func )
为所有从threading模块started的线程设置一个轮廓函数。对每个线程而言,这个函数将在线程的run()方法被调用前被传到sys.setprofile()中。
threading. stack_size ( [ size ] )

返回创建新的线程时使用的线程堆栈的大小。可选的大小参数指定将用于随后创建线程的堆栈的大小,并且必须为0(使用平台或配置的默认值)或者一个大于等于32768(32Kib)的正整数。如果size没有指定,就设为0.如果不支持改变线程堆栈大小,将抛出一个RntimeError。如果指定的堆栈大小是无效的,将抛出一个ValueError同时不会改变堆栈的size。32Kib是一般情况下必须提供的最小的堆栈大小值,以保证解释器本身有足够的栈空间。注意:一些平台可能在关于堆栈size的值上有特殊的限制条件,比如要求最小的堆栈size>32kib或者要求分配视同内从页大小的整数倍-----平台的文档应该提及到更多的信息。(4kib 页数是一般情况,当缺少指定信息时建议使用4096的整数倍当做堆栈大小)应用范围:Windows,POSIX线程接口的系统


这个模块同时定义了下面这些内容:

threading.TIMEOUT_MAX

阻塞函数所允许的超时参数的最大值(Lock.acquire(),RLock.acquire(),Condition.wait(),etc.)指定一个大于此最大值的timeout将抛出OverflowError。

New in version 3.2.

这个模块定义了几个类,下面小节中详细介绍它们。

这个模块的设计是松散的基于Java的线程模型。然而,Java使锁(Lock)和环境变量成为每个对象的基本行为,他们在Python中是分开的对象。Python的Thread类支Java的线程类的一个行为子集;一般地,这里没有优先顺序,没有线程组,并且线程不能被摧毁,终止,暂停,恢复,中断。当我们实现Java线程的静态方法时,静态方法将被映射到模块层函数。

下面介绍的所有方法是原子级执行的。

17.1.1. Thread-Local Data

本地线程数据是指那些被线程指定了值的数据。为了管理本地线程数据,创建一个local或一个子类的实例,将属性存储在其中:

mydata = threading.local()
mydata.x = 1

对于几个单独的线程是不同的。

class threading. local

一个代表本地线程数据的类。

For more details and extensive examples, see the documentation string of the _threading_local module.

17.1.2. Thread Objects

Thread类代表在单独的控制线程中运行的活动。有两种方式去指定这个活动:1.通过传递一个可调用对象给构造器,2.通过在子类中复写run()方法。没有其他的方法(除了构造函数)需要在这个子类中复写。换句话说,只有复写__init__()和该类的run()方法。

一旦一个线程对象被创建,他的活动必须通过调用这个线程的start()方法启动。在一个单独的控制线程中调用run()方法。

一旦这个线程的活动被启动,就认为这个线程是‘alive’的。当他的run()方法被终止它才会停止alive状态---或者,通常情况下,抛出一个不可解决的异常时也会停止allive状态。is_alive()方法可以测试线程是否alive。

一旦线程可以调用其中一个线程的join()方法。它将阻塞调用线程直到调用的join()方法被终止。

一个线程拥有一个名字。这个名字将被传递给构造器,并且通过name属性读和改变其值。

一个线程可以被标记为“daemon thread”。这个标志的意义是当只剩daemon线程时整个Python程序退出。其初始值是从创建线程中继承的。这个标志量可以通过daemon属性或者daemon构造器参数设定。

注意:Daemon 线程在关机时会终止。他们的资源(比如打开的文件,数据库事务等)可能无法被正确的释放。

如果你希望你的线程优雅的stop,确保他们是non-daemonic并且使用一个合适的信号量机制比如Event.

这里有一个“main thread”对象,它相当于Python程序初始控制线程。他不是一个daemon线程。

有时可能需要创建“dummy thread object”.这些在threading模块之外启动的控制线程对象相当于“alien threads”,比如直接从C代码中启动。dummy thread对象拥有有限的函数,他们被看做是alive的并且daemonic,并且不能使用join()方法。因为无法检测到alien 线程的终止,所以它们不能被删除。

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

这个构造器总是携带着关键字参数被调用。参数如下:

group 应该为None;为了未来当一个ThreadGroup类被实现时扩展用。

target
















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值