Python中Threading用法详解


Posted in Python onDecember 27, 2017

Python的threading模块松散地基于Java的threading模块。但现在线程没有优先级,没有线程组,不能被销毁、停止、暂停、开始和打断。 Java Thread类的静态方法,被移植成了模块方法。

main thread: 运行python程序的线程

daemon thread 守护线程,如果守护线程之外的线程都结束了。守护线程也会结束,并强行终止整个程序。不要在守护进程中进行资源相关操作。会导致资源不能正确的释放。在非守护进程中使用Event。

Thread 类

(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
group: 为以后的ThreadGroup类预留
target: 被执行的对象,由run()方法执行
args: target对象使用的参数
daemon: 是否为守护进程

start()

每个thread 对象都只能被调用1次start()

run()

如果创建Thread的子类,重写该方法。负责执行target参数传来的可执行对象。

join()

阻塞线程直到结束。

GIL

在CPython中,由于GIL的存在,Python每次只能执行一个线程。如果要充分利用多核机器的计算资源需要使用multiprocessing或者是concurrent.futures.ProcessPollExecutor。 但,但如果你想要很多I/O相关的并发操作,threding仍然是一个很好的选择 。?因为系统自动实现了线程的上下文切换。

from threading import Thread
import requests
url = 'http://www.baidu.com'
urls = [url]*20
threads = []

for url in urls:
  t = Thread(target=requests.get, args=(url, ))
  t.start()
  threads.append(t)
for t in threads:
  t.join()

锁(Lock)对象

原始锁(primitive lock),当它锁住的时候,它是一种不属于任何一个线程的同步原语(synchronization primitive)。 在Python中,他是目前可用的最底层的同步原语,由_thread模块提供。

一个原始锁有两个状态:locked 和unlocked。锁创建时,处于unlocked状态。 锁由两个基本方法:acquire()和release()。

当处于unlocked状态时,acquire(()方法可以将状态变为locked,并立即返回。当处于locked状态时,acquire()会阻塞直至另一个线程调用了release()使改锁解锁,然后acquire()将锁上锁,并返回。

release()方法只能在锁locked时别调用,并释放锁。否则会抛出RuntimeError错误。

如果有多个 acquire()在等待解锁,则不确定哪一个哪一个会被触发。

class threading.Lock

如果一个线程acquire了一个锁,那么后续获取它的线程都会被阻塞,直至锁被释放。任何线程都可以释放锁。

Lock是一个工厂函数,返回当前平台下最高效的concrete Lock类的实例。

Lock支持上下文管理方法(context management protocol),也就是with 语句。在存在竞态条件(race condition)的时候,要使用锁。比如多线程共同操作某个数据。

# 摘自python Cookbook
import threading
class SharedCounter:
  def __init__(self, init_value=0):
    self._value = init_value
    self._value_lock = threading.Lock()  
  def incr(self, delta=1):
    # 在这里使用了with 语句,创建一个锁,增加值,释放锁。
    with self._value_lock:
      self._value += 1

RLock对象

可重入锁(reentrant lock)。感觉是一个锁中锁,就是可以递归的锁。等见到具体的应用例子再写。

Condition对象

condition变量总是与某种锁相关,锁可以是传过来的,也可以通过默认设置创建。如果有多个 condition对象需要共享一个锁时,传递一个锁是非常有用的。锁是condition对象的一部分,你不用刻意的跟踪它。

Timer对象

Timer是Thread的子类,所以也要接受function参数,也可以被start()。 它的run()函数被重写为先event.wait(interval),再启动function。

Barrier对象

实现某些服务的共进退。

threading.Barrier(parties, action=None, timeout=None)

设置n=parties个线程,当n个barrier.wait()被调用后,所有这些调用的阻塞被同时解除,执行action

感觉Barrier可以实现很多复杂的功能。

Python 相关文章推荐
php使用递归与迭代实现快速排序示例
Jan 23 Python
Python不规范的日期字符串处理类
Jun 10 Python
python读取word文档的方法
May 09 Python
python 转换 Javascript %u 字符串为python unicode的代码
Sep 06 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
Nov 17 Python
总结Python图形用户界面和游戏开发知识点
May 22 Python
在windows下使用python进行串口通讯的方法
Jul 02 Python
如何基于Python实现电子邮件的发送
Dec 16 Python
keras使用Sequence类调用大规模数据集进行训练的实现
Jun 22 Python
Java爬虫技术框架之Heritrix框架详解
Jul 22 Python
Python中openpyxl实现vlookup函数的实例
Oct 28 Python
Python实现学生管理系统并生成exe可执行文件详解流程
Jan 22 Python
SVM基本概念及Python实现代码
Dec 27 #Python
Python自定义函数定义,参数,调用代码解析
Dec 27 #Python
详解用Python处理HTML转义字符的5种方式
Dec 27 #Python
Python中使用支持向量机(SVM)算法
Dec 26 #Python
Python中支持向量机SVM的使用方法详解
Dec 26 #Python
详解python中的 is 操作符
Dec 26 #Python
matplotlib简介,安装和简单实例代码
Dec 26 #Python
You might like
通过对服务器端特性的配置加强php的安全
2006/10/09 PHP
ThinkPHP 在阿里云上的nginx.config配置实例详解
2017/10/11 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
JsDom 编程小结
2011/08/09 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
2015/12/03 Javascript
用vue写一个仿简书的轮播图的示例代码
2018/03/13 Javascript
详解angular部署到iis出现404解决方案
2018/08/14 Javascript
Element-UI踩坑之Pagination组件的使用
2018/10/29 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
2018/11/14 Javascript
vue组件之间的数据传递方法详解
2019/04/19 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
微信小程序基于canvas渐变实现的彩虹效果示例
2019/05/03 Javascript
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
2019/05/21 Javascript
深入了解JavaScript 的 WebAssembly
2019/06/15 Javascript
微信小程序开发技巧汇总
2019/07/15 Javascript
[01:10:48]完美世界DOTA2联赛PWL S2 GXR vs PXG 第一场 11.18
2020/11/18 DOTA
Python开发WebService系列教程之REST,web.py,eurasia,Django
2014/06/30 Python
Python实现的HTTP并发测试完整示例
2020/04/23 Python
Python中用sleep()方法操作时间的教程
2015/05/22 Python
在Linux命令行终端中使用python的简单方法(推荐)
2017/01/23 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
numpy库reshape用法详解
2020/04/19 Python
Django实现前台上传并显示图片功能
2020/05/29 Python
解决pytorch 保存模型遇到的问题
2021/03/03 Python
HTML5输入框下拉菜单功能的示例代码
2020/09/08 HTML / CSS
什么是Web Service?
2012/07/25 面试题
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
2014年六一儿童节演讲稿
2014/05/23 职场文书
法制教育演讲稿
2014/09/10 职场文书
2014购房个人委托书范本
2014/10/12 职场文书
教师自荐信范文
2015/03/06 职场文书
民间借贷被告代理词
2015/05/23 职场文书
2015年加油站站长工作总结
2015/05/27 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
netty 实现tomcat的示例代码
2022/06/05 Servers