`

Python线程整理

阅读更多
线程有五种状态

新建、就绪、运行、阻塞、死亡。

阻塞有三种情况:
  • 同步阻塞是指处于竞争锁定的状态,线程请求锁定时将进入这个状态,一旦成功获得锁定又恢复到运行状态;
  • 等待阻塞是指等待其他线程通知的状态,线程获得条件锁定后,调用“等待”将进入这个状态,一旦其他线程发出通知,线程将进入同步阻塞状态,再次竞争条件锁定;
  • 而其他阻塞是指调用time.sleep()、anotherthread.join()或等待IO时的阻塞,这个状态下线程不会释放已获得的锁定。


python提供了两种使用线程的方式,一种是函数式的,一种是类包装的。

   * thread
   * threading

1、thread:
>>> import thread
>>> dir(thread)
['LockType', '__doc__', '__name__', '__package__', '_count', '_local', 'allocate', 'allocate_lock', 'error', 'exit', 'exit_thread', 'get_ident', 'interrupt_main', 'stack_size', 'start_new', 'start_new_thread']


thread.start_new_thread ( function , args [ , kwargs ] )
调用thread模块中的start_new_thread()函数来产生新的线程。

2、threading:
>>> import threading
>>> dir(threading)
['BoundedSemaphore', 'Condition', 'Event', 'Lock', 'RLock', 'Semaphore', 'Thread', 'ThreadError', 'Timer', '_BoundedSemaphore', '_Condition', '_DummyThread', '_Event', '_MainThread', '_RLock', '_Semaphore', '_Timer', '_VERBOSE', '_Verbose', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_active', '_active_limbo_lock', '_after_fork', '_allocate_lock', '_counter', '_enumerate', '_format_exc', '_get_ident', '_limbo', '_newname', '_pickSomeNonDaemonThread', '_profile_hook', '_shutdown', '_sleep', '_start_new_thread', '_sys', '_test', '_time', '_trace_hook', 'activeCount', 'active_count', 'currentThread', 'current_thread', 'deque', 'enumerate', 'local', 'setprofile', 'settrace', 'stack_size', 'warnings']


>>> dir(threading.Thread)
['_Thread__bootstrap', '_Thread__bootstrap_inner', '_Thread__delete', '_Thread__exc_clear', '_Thread__exc_info', '_Thread__initialized', '_Thread__stop', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_block', '_note', '_reset_internal_locks', '_set_daemon', '_set_ident', 'daemon', 'getName', 'ident', 'isAlive', 'isDaemon', 'is_alive', 'join', 'name', 'run', 'setDaemon', 'setName', 'start']


threading 模块提供的常用方法:
  • threading.currentThread(): 返回当前的线程变量。
  • threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
  • threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。


继承threading.Thread方法,重写run方法。

threading.Thread类的初始化函数原型:def __init__(self, group=None, target=None, name=None, args=(), kwargs={})
  参数group是预留的,用于将来扩展;
  参数target是一个可调用对象(也称为活动[activity]),在线程启动后执行;
  参数name是线程的名字。默认值为“Thread-N“,N是一个数字。
  参数args和kwargs分别表示调用target时的参数列表和关键字参数。


join()方法,调用该方法的线程将等待直到该Thread对象完成,再恢复运行。
调用Thread.join将会使主调线程堵塞,直到被调用线程运行结束或超时。参数timeout是一个数值类型,表示超时时间,如果未提供该参数,那么主调线程将一直堵塞到被调线程结束。

threading.Lock对象:mutex,有acquire()和release()方法

RLock允许在同一线程中被多次acquire。而Lock却不允许这种情况。注意:如果使用RLock,那么acquire和release必须成对出现,即调用了n次acquire,必须调用n次的release才能真正释放所占用的琐。

threading.Condition对象:condition variable,建立该对象时,会包含一个Lock对象(因为condition variable总是和mutex一起使用)。可以对Condition对象调用acquire()和release()方法,以控制潜在的Lock对象。

  • Condition.wait([timeout]):  wait方法释放内部所占用的琐,同时线程被挂起,直至接收到通知被唤醒或超时(如果提供了timeout参数的话)。当线程被唤醒并重新占有琐的时候,程序才会继续执行下去。
  • Condition.notify():  唤醒一个挂起的线程(如果存在挂起的线程)。注意:notify()方法不会释放所占用的琐。
  • Condition.notifyAll()  唤醒所有挂起的线程(如果存在挂起的线程)。注意:这些方法不会释放所占用的琐。



参考资料:
http://docs.python.org/2/library/threading.html
http://www.cnblogs.com/vamei/archive/2012/10/11/2720042.html
http://www.pythonclub.org/python-basic/threading
http://blog.csdn.net/JGood/article/details/4299476
http://docs.python.org/2/library/thread.html#module-thread
http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html
分享到:
评论

相关推荐

    Python 基础 之 python 线程知识点整理,并实现一个简单多线程 udp 聊天应用

    Python 基础 之 python 线程知识点整理,并实现一个简单多线程 udp 聊天应用   目录 Python 基础 之 python 线程知识点整理,并实现一个简单多线程 udp 聊天应用 一、简单介绍 二、能学到 三、实现思路 四、效果...

    python多线程图片自动识别代码

    【Python多线程图片自动识别】是Python编程领域中一种高效处理大量图片的应用技术,它结合了计算机视觉和多线程编程。在这个场景下,我们使用Python来实现一个能够自动识别图片内容的系统,同时优化进度条显示和数据...

    Python进阶必备——HiKari为了拿捏Python整理的技术笔记

    1. **多线程与GIL(全局解释器锁)**:Python的多线程在CPython实现中受到GIL限制,无法实现真正的并行计算。理解GIL的存在可以帮助我们避免线程间的同步问题,并选择合适的并发模型。 2. **多进程与进程间通信...

    Python非常详细编程笔记及Python深入理解CHM版

    CHM版的"Python深入理解"部分可能包含了Python的高级主题,如元类、生成器表达式、异步编程(协程和asyncio库)、异常处理、文件I/O、网络编程、并发与多线程、性能优化等。这些内容将帮助你提升对Python深层机制的...

    Python编程笔记 Python开发知识总结整理 Python核心笔记 共51页.pdf

    Python编程笔记是对Python开发知识的全面总结和整理,旨在帮助读者深入理解和掌握这门流行的高级编程语言。笔记分为两大部分,第一部分是Python的核心概念,第二部分涉及更高级的主题。 在前言中,作者可能介绍了...

    python3多进程多线程协程IO多路复用等

    对python并发进行的笔记整理,个人所学习使用,主要包括多进程,多线程,协程,IO多路复用,进程线程通信等

    2014年辛星python标准库整理夏季版

    在2014年,辛星完成了对Python标准库的整理工作,发布了一个名为“2014年辛星python标准库整理夏季版”的文档。这份文档是对Python标准库的一次深入梳理和总结,尽管辛星本人承认这份文档可能不全面,并承诺在未来的...

    Python项目整理: 基础入门、数据分析、爬虫实践-Python-Projects.zip

    这个名为"Python项目整理:基础入门、数据分析、爬虫实践-Python-Projects.zip"的压缩包文件显然是一个综合性的学习资源,旨在帮助用户通过实际项目来提升Python技能。下面,我们将深入探讨这些关键领域的知识点。 ...

    Python知识点整理.zip

    11. **并发编程**:Python提供了线程和进程两种并发模型,以及异步I/O(如asyncio库),用于编写高效的并发程序。 12. **单元测试**:Python的unittest模块提供了一套完善的单元测试框架,帮助开发者确保代码质量。...

    Python-北邮部分机试题整理

    14. **并发编程**:多线程、多进程的使用,了解GIL(全局解释器锁)及其对Python多线程的影响,以及异步I/O模型(如asyncio)。 15. **数据库操作**:使用SQLite或MySQL等数据库,了解SQL语言,使用Python的数据库...

    Python学习个人笔记整理

    - 多线程和异步:了解如何使用Python的threading库实现多线程爬虫,以及asyncio库实现异步爬虫,提高爬取效率。 通过阅读和实践这四个部分的笔记,你将能够从零开始逐步掌握Python语言,并具备基本的网络爬虫开发...

    Python学习资料整理

    8. **高级主题**:如正则表达式、多线程、多进程、异步编程(如asyncio库)以及数据科学相关的库如NumPy、Pandas、Matplotlib等。 压缩包中的“书”可能是指实际的电子书文件,这些书籍可能包括了《Python编程:从...

    Python-可以断点续爬的豆瓣单线程图书爬虫

    【Python-可以断点续爬的豆瓣单线程图书爬虫】 在Python的世界里,Web爬虫是一种常用的数据获取工具,用于自动化地抓取互联网上的信息。本项目专注于构建一个针对豆瓣图书的单线程爬虫,其核心特点是支持断点续爬。...

    Python实现多线程爬虫

    其实网络上已经有很多基于Python的入门爬虫程序了,所以学习起来比较方便,唯独那个多线程爬虫一直都学的不是很明白,所以就写下这篇blog记录一下学到的一些东西(主要是对自己所学的一些东西进行整理和总结)。...

    Python-portSpider一个快速多线程网络扫描框架

    5. **结果收集**:所有线程扫描完成后,收集并整理结果,包括开放的端口、服务类型等信息。 6. **结果输出**:将扫描结果输出到指定文件,供用户查看和分析。 ### 3. 使用指南 使用`portSpider`通常涉及以下步骤:...

    【源代码】Pythone+PyQt5+爬虫+多线程 : 豆瓣陶书工具(GUI)

    标题中的"【源代码】Pythone+PyQt5+爬虫+多线程 : 豆瓣陶书工具(GUI)"表明这是一个使用Python编程语言,结合PyQt5图形用户界面库,实现的一个爬虫程序,该程序具备多线程功能,并且主要目标是通过抓取豆瓣网站的数据...

    python中文api文档+学习笔记

    最后,`pythonAPI和学习笔记大礼包` 这个文件很可能包含了一位开发者或者教育者整理的Python学习笔记,可能包括个人的理解、实例代码、常见问题解答等。这样的笔记通常具有很高的实用价值,因为它们是实践经验和思考...

    python 中文API 和python学习笔记

    这份“超级全面的学习笔记”可能涵盖Python的基础语法、数据结构、控制流、函数、面向对象编程、异常处理、文件操作、模块和包、网络编程、多线程等主题。通过这些笔记,学习者可以得到更直观、更具实践性的指导,...

Global site tag (gtag.js) - Google Analytics