zoukankan      html  css  js  c++  java
  • Python——thread

      该模块在Python 3中更名为 _thread。

      该模块实现对Python多线程的低层次操作原语,也提供了多线程之间用于同步的锁机制。threading 模块基于本模块提供了更易用的高层次线程API。Windows、Linux、SGI IRIX、Solaris 2.x、和支持 POSIX thread (a.k.a. “pthread”) 的平台都支持该模块,对于不支持 thread 模块的平台,使用 dummy_thread 作为替代。

    该模块中定义的常量和函数

     exception thread.error 

      当出现线程相关的异常时抛出

     thread.LockType 

      lock 对象的类型

     thread.start_new_thread(function, args[, kwargs]) 

      启动一个新线程,返回它的标识符。

      该新启动的线程会用参数列表 args (必须是一个元组)中的参数调用 function,关键字参数 kwargs 是可选的。当函数 function 返回时,执行它的线程静默退出,当函数因为一个未处理的异常而终止时,线程退出同时打印堆栈轨迹。

     thread.interrupt_main() 

      在主线程中抛出异常 KeyboardInterrupt,子线程可以使用该函数去打断主线程

      Python 2.3 引入

     thread.exit() 

      抛出异常 SystemExit,如果这个异常没有被捕获,会让线程静默退出

     thread.allocate_lock() 

      返回一个新的 lock 对象,该实例初始时没有被上锁

     thread.get_ident() 

      返回当前线程的线程标识符,这是一个非零整数,值并没有实际意义,就是用来在线程相关的字典中检索指定线程的信息,当一个线程退出时,它的标识符会被回收等待以后创建新线程时使用。

     thread.stack_size([size]) 

      返回创建线程时使用的线程栈大小,可选参数 size 指示以后创建新线程时的栈大小,必须是0(使用平台默认)或者是一个不小于32,768 (32kB)的整数。如果不支持改变线程栈的大小,该函数将会抛出异常 error。如果指定的栈大小无效,将会抛出 ValueError,同时下次新建线程时栈的大小不变。

      32kB 是Python当前支持的最小栈空间,如果没有查阅具体的平台对于线程栈大小的具体规范,使用4KB的倍数是一个比较保险的办法。

      适用于: Windows, systems with POSIX threads.

      Python 2.5 引入

    Lock 对象

     lock.acquire([waitflag]) 

      无参数调用时,该方法会无条件的获得锁,或者等待其他的线程释放锁(一次只有一个线程可以获得锁),如果提供整型参数 waitflag,该方法的行为依赖于这个参数:

      如果 waitflag 是0:只有在该锁可以立即获得(不用等待)时才会让这个线程获得锁;

      如果 waitflag 非0:线程会像无参数时那样获取锁

      返回值:

      成果获得锁返回 True ,否则返回 False

     lock.release() 

      释放锁,必须是已经获得的锁,但可以不是同一个线程。

     lock.locked() 

      返回 lock 对象的状态:如果已经被某些线程获取就返回 True ,否则返回 False

    示例:使用 with 语句使用线程锁

    import thread
    
    a_lock = thread.allocate_lock()
    
    with a_lock:
        print "a_lock is locked while this executes"

    注意事项

    • 线程和中断的交互比较奇怪:异常 KeyboardInterrupt 可以被任意线程接收,(当 signal 模块可用时,中断总是发向主线程
    • 调用 sys.exit() 或抛出异常 SystemExit 等价于调用 thread.exit()
    • acquire() 方法是不可中断的—— KeyboardInterrupt 会在锁获取后才发生
    • 当主线程退出时,其他线程的行为是平台定义的,SGI IRIX 使用可原生的线程实现,所以其他的线程能够存活;在大多数其他平台上,其他的线程会被直接杀掉,而不用执行 try ... finally 分句或其他的对象析构函数
    • 当主线程退出时,不会执行除 try ...finally 以外的其他清理,标准I/O也不会被刷出。
  • 相关阅读:
    给出一个单向链表的头指针,输出该链表中倒数第K个节点的指针
    把二元查找树转变成排序的双向链表
    动态规划0/1背包问题
    判断一字符串是不是对称的
    动态链接库dll,静态链接库lib, 导入库lib(转载)
    基于格点数据分析和表达
    Silverlight Wcf 获取集合数据并绑定(DataContract,DataMember)
    让你学会使用WCF服务端配置
    数据契约(DataContract)
    symbol详解
  • 原文地址:https://www.cnblogs.com/Security-Darren/p/4185269.html
Copyright © 2011-2022 走看看