多线程库总结

基于线程的并行性

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

参考线程总结

项目:

  1. 实现一
  2. 实现二

Python 多线程库总结的更多相关文章

  1. 【python标准库学习】thread,threading(一)多线程的介绍和使用

    在单个程序中我们经常用多线程来处理不同的工作,尤其是有的工作需要等,那么我们会新建一个线程去等然后执行某些操作,当做完事后线程退出被回收.当一个程序运行时,就会有一个进程被系统所创建,同时也会有一个线 ...

  2. python多线程学习记录

    1.多线程的创建 import threading t = t.theading.Thread(target, args--) t.SetDeamon(True)//设置为守护进程 t.start() ...

  3. Python 多线程教程:并发与并行

    转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...

  4. python常用库

    本文由 伯乐在线 - 艾凌风 翻译,Namco 校稿.未经许可,禁止转载!英文出处:vinta.欢迎加入翻译组. Awesome Python ,这又是一个 Awesome XXX 系列的资源整理,由 ...

  5. Python多线程开发简介

    Python的并发程序可以使用multiprocessing库.threading库.asyncio库.concurrent.futures库以及selectors库等等协助编写: multiproc ...

  6. python标准库00 学习准备

    Python标准库----走马观花 python有一套很有用的标准库.标准库会随着python解释器一起安装在你的电脑上的.它是python的一个组成部分.这些标准库是python为你准备的利器,可以 ...

  7. Python标准库——走马观花

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python有一套很有用的标准库(standard library).标准库会随着 ...

  8. 【python,threading】python多线程

    使用多线程的方式 1.  函数式:使用threading模块threading.Thread(e.g target name parameters) import time,threading def ...

  9. <转>Python 多线程的单cpu与cpu上的多线程的区别

    你对Python 多线程有所了解的话.那么你对python 多线程在单cpu意义上的多线程与多cpu上的多线程有着本质的区别,如果你对Python 多线程的相关知识想有更多的了解,你就可以浏览我们的文 ...

随机推荐

  1. 45. leetcode 504. Base 7

    504. Base 7 Given an integer, return its base 7 string representation. Example 1: Input: 100 Output: ...

  2. 引水入城[NOI2010 ]

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N行M列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. 为了 ...

  3. ECMAScript6-let与const命令详解

    前言 <ECMAScript入门>是一本开源的JavaScript语言教程,全面介绍ECMAScript6新引入的语法特性. let和const命令,是第一章开始介绍,也是比较基础的知识. ...

  4. [Noi2008]假面舞会

    考试的时候果断放弃,cout<<"-1 -1"骗10分hhh... 这也是图上问题.注意题目意思: ①如果有多个点指向同一个点,那么他们属于同一类别. ②一个点看到的所 ...

  5. iOS 折线图实现

    图表绘制的过程实际上是坐标位置的计算过程,至于画线只要有了position,通过CAShapeLayer+BezierPath很快就可以画出来,这里提供一个绘制折线的demo,贵在思路,有需要的可以参 ...

  6. python进阶(7):面向对象进阶

    学了面向对象三大特性继承,多态,封装.今天我们看看面向对象的一些进阶内容,反射和一些类的内置函数. 一.isinstance和issubclass class Foo: pass class Son( ...

  7. python编程基础知识—列表(二)

    3操作列表 3.1 遍历整个列表 使用for循环 cars = ['bmw','audi','toyota','Jeep'] for i in cars: print(i) bmw audi toyo ...

  8. .NET并行计算和并发2-Foreground and Background Threads

    后台线程不会使托管执行环境处于运行状态,除此之外,后台线程与前台线程是一样的. 一旦所有前台线程在托管进程(其中 .exe 文件是托管程序集)中被停止,系统将停止所有后台线程并关闭.

  9. 360春秋杯CTF比赛WRIteUP

    题目:where is my cat? 地址:http://106.75.34.78 访问网页出现证书错误的问题,查看证书如下: 抓包发现: Accept-Encoding: gzip, deflat ...

  10. CentOS7 搭建Git服务器(转)

    1.在服务器上创建一个新用户 adduser git 2.创建一个Git仓库 cd /data/git //切换到希望创建工作区的目录git init --bare sample.git //创建一个 ...