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也不会被刷出。
  • 相关阅读:
    系统维护相关问题
    Python环境维护
    哈希表解决字符串问题
    论文笔记二:《A Tutoral on Spectral Clustering》
    论文笔记之哈希学习比较--《Supervised Hashing with Kernels》《Towards Optimal Binary Code Learning via Ordinal Embedding》《Top Rank Supervised Binary Coding for Visual Search》
    Java中String、StringBuffer、StringBuilder的比较与源 代码分析
    浙大pat1040 Longest Symmetric String(25 分)
    浙大pat1039 Course List for Student(25 分)
    浙大pat---1036 Boys vs Girls (25)
    百炼oj-4151:电影节
  • 原文地址:https://www.cnblogs.com/Security-Darren/p/4185269.html
Copyright © 2011-2022 走看看