Python 多线程库总结
多线程库总结
基于线程的并行性
threading模块
下面是一些基础函数,函数包括:
| 函数 |
|---|
| threading.active_count() |
| threading.current_thread() |
| threading.get_ident() |
| threading.enumerate() |
| threading.main_thread() |
| threading.settrace(func) |
| threading.setprofile(func) |
| threading.stack_size([size]) |
| threading.TIMEOUT_MAX |
threading模块一共提供的类包括:local、Thread、Lock、RLock、Condition、Semaphore、Event、Time
1. Thead-Local Data
专门用来管理线程局部的数据,也就是说一个线程会对应一个local,当前线程无法访问其它线程的局部数据,线程设置的属性也不会被其它线程同名的属性给替换掉。
| 函数 |
|---|
| threading.local |
例子如下:
import threading
class MyThread1(threading.Thread):
def run(self):
local = threading.local()
if 'name' not in local.__dict__:
print('thread1 not set name')
local.name = 'li'
print('thread1 {}'.format(local.name))
class MyThread2(threading.Thread):
def run(self):
local = threading.local()
if 'name' not in local.__dict__:
print('thread2 not set name')
local.name = 'wang'
print('thread2 {}'.format(local.name))
def main():
print("Start main threading")
local = threading.local()
local.name = 'main'
threads = [MyThread1(), MyThread2()]
for t in threads:
t.start()
# 一次让新创建的线程执行 join
for t in threads:
t.join()
print('main {}'.format(local.name))
if __name__ == '__main__':
main()
其最后的输出结果为:
Start main threadingthread1 not set namethread1 lithread2 not set namethread2 wangmain main
2. Thread Obects
| 函数 |
|---|
| class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None) |
| start() |
| run() |
| join(timeout=None) |
| name |
| getName()/setName() |
| ident |
| is_alive() |
| daemon |
| isDaemon()/setDaemon() |
线程的创建有两种实现方式,分别是1.通过将一个可调用对象传递到构造函数中;2.通过继承Thread,在子类中重写run方法。Thread类定义为:
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
# group应为None;保留用于在实现ThreadGroup类时的未来扩展。
# target是将被run()方法调用的可调用对象。默认为None,表示不调用任何东西。
# name是线程的名字。默认情况下,以“Thread-N”的形式构造一个唯一的名字,N是一个小的十进制整数。
# args是给调用目标的参数元组。默认为()。
# kwargs是给调用目标的关键字参数的一个字典。默认为{}。
# 如果daemon不是None,守护程序显式设置线程是否为daemonic。如果为None(默认值),daemonic属性从当前线程继承。
注意:应该始终以关键字参数调用该构造函数。
3. Lock Objects
为了保证数据的准确性,引入了锁的概念,原锁是一个同步原语,是当前可用的最低级同步原语。
| 函数 |
|---|
| class threading.Lock |
| acquire(blocking=True, timeout=-1) |
| release() |
4. RLock Objects
和Lock的区别在于RLock允许在同一线程中被多次acquire,但是Lock却不允许这种情况,使用acquire的次数需要和release的次数相互对应;
| 函数 |
|---|
| class threading.Lock |
| acquire(blocking=True, timeout=-1) |
| release() |
5. Condition Objects
条件变量总是与某种锁相关联
| 函数 |
|---|
| class threading.Condition(lock=None) |
| acquire(*args) |
| release() |
| wait(timeout=None) |
| wait_for(predicate, timeout=None) |
| notify(n=1) |
| notify_all() |
6. Semaphore Objects
信号量管理内部计数器,每个acquire()调用递减,每个release()调用递增。计数器永远不会低于零;当acquire()发现它为零时,它阻塞,等待其他线程调用release()。
| 函数 |
|---|
| class threading.Semaphore(value=1) |
| class threading.BoundedSemaphore(value=1) |
| acquire(blocking=True, timeout=None) |
| release() |
7. Event Objects
事件对象是线程间最简单的通信机制之一:线程可以激活在一个事件对象上等待的其他线程。每个事件对象管理一个内部标志,可以在事件对象上调用set() 方法将内部标志设为true,调用 clear() 方法将内部标志重置为false。wait()方法将阻塞直至该标志为真。
| 函数 |
|---|
| class threading.Event |
| is_set() |
| set() |
| clear() |
| wait(timeout=None) |
8. Timer Objects
这个类表示一个动作应该在一个特定的时间之后运行 — 也就是一个计时器。Timer是Thread的子类, 因此也可以使用函数创建自定义线程
| 函数 |
|---|
| class threading.Timer(interval, function, args=None, kwargs=None) |
| cancel() |
9. Barrier Objects
这个类提供了一个简单的同步原语,供需要彼此等待的固定数量的线程使用。每个线程尝试通过调用wait()方法传递屏障,并将阻塞,直到所有线程都调用。
| 函数和属性 |
|---|
| class threading.Barrier(parties, action=None, timeout=None) |
| wait(timeout=None) |
| reset() |
| abort() |
| parties |
| n_waiting |
| broken |
| exception threading.BrokenBarrierError |
参考线程总结
项目:
Python 多线程库总结的更多相关文章
- 【python标准库学习】thread,threading(一)多线程的介绍和使用
在单个程序中我们经常用多线程来处理不同的工作,尤其是有的工作需要等,那么我们会新建一个线程去等然后执行某些操作,当做完事后线程退出被回收.当一个程序运行时,就会有一个进程被系统所创建,同时也会有一个线 ...
- python多线程学习记录
1.多线程的创建 import threading t = t.theading.Thread(target, args--) t.SetDeamon(True)//设置为守护进程 t.start() ...
- Python 多线程教程:并发与并行
转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...
- python常用库
本文由 伯乐在线 - 艾凌风 翻译,Namco 校稿.未经许可,禁止转载!英文出处:vinta.欢迎加入翻译组. Awesome Python ,这又是一个 Awesome XXX 系列的资源整理,由 ...
- Python多线程开发简介
Python的并发程序可以使用multiprocessing库.threading库.asyncio库.concurrent.futures库以及selectors库等等协助编写: multiproc ...
- python标准库00 学习准备
Python标准库----走马观花 python有一套很有用的标准库.标准库会随着python解释器一起安装在你的电脑上的.它是python的一个组成部分.这些标准库是python为你准备的利器,可以 ...
- Python标准库——走马观花
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python有一套很有用的标准库(standard library).标准库会随着 ...
- 【python,threading】python多线程
使用多线程的方式 1. 函数式:使用threading模块threading.Thread(e.g target name parameters) import time,threading def ...
- <转>Python 多线程的单cpu与cpu上的多线程的区别
你对Python 多线程有所了解的话.那么你对python 多线程在单cpu意义上的多线程与多cpu上的多线程有着本质的区别,如果你对Python 多线程的相关知识想有更多的了解,你就可以浏览我们的文 ...
随机推荐
- Swift学习之元组(Tuple)
定义 元组是由若干个类型的数据组成,组成元组的数据叫做元素,每个元素的类型都可以是任意的. 用法一 let tuples1 = ("Hello", "World" ...
- RabbitMQ入门-高效的Work模式
扛不住的Hello World模式 上篇<RabbitMQ入门-从HelloWorld开始>介绍了RabbitMQ中最基本的Hello World模型.正如其名,Hello World模型 ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(一)设计一套好的RESTful API
写在前面的话 看了一下博客目录,距离上次更新这个系列的博文已经有两个多月,并不是因为不想继续写博客,由于中间这段时间更新了几篇其他系列的文章就暂时停止了,如今已经讲述的差不多,也就继续抽时间更新< ...
- <Mastering KVM Virtualization>:第一章 了解Linux虚拟化
本章为读者提供了Linux虚拟化中流行技术的深刻见解,以及相较于其他同类技术的优势特点.本书共有14章,囊括了KVM虚拟化中的各个方面,从KVM的内部构造开始,并包括了诸如软件定义网络(SDN),性能 ...
- 细说 Java 的深拷贝和浅拷贝
版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有. 未经允许,不得转载. 一.前言 任何变成语言中,其实都有浅拷贝和深拷贝的概念,Java 中也不例外.在对一个现 ...
- SpringBoot集成MyBatis的分页插件PageHelper(回头草)
俗话说:好
- AIX缩小逻辑卷报错chfs: 0506-964
--AIX缩小逻辑卷报错chfs: 0506-964 -----------------------------------------2013/10/29 通过smit chfs/或 chfs命令 ...
- JS数组操作中的经典算法
冒泡排序<script type="text/javascript"> var arr = [3,7,6,2,1,5]; 定义一个交换使用的中间变量var temp = ...
- C/C++ 知识点---sizeof使用规则及陷阱分析(网摘)
C/C++ 知识点---sizeof使用规则及陷阱分析 原文出处:[胖奇的专栏] 1.什么是sizeof 首先看一下sizeof在msdn上的定义: The sizeof keyword gi ...
- java8之stream
lambda表达式是stream的基础,初学者建议先学习lambda表达式,http://www.cnblogs.com/andywithu/p/7357069.html 1.初识stream 先来一 ...