python多进程和多线程编程
17 多线程和多进程并发
The modules described in this chapter provide support for concurrent execution of code. The appropriate choice of tool will depend on the task to be executed (CPU bound vs IO bound) and preferred style of development (event
driven cooperative multitasking vs preemptive multitasking).
17.1 threading --- 基于线程的并发
threading是一个基于_thread(python2中的thread)高级模块,和queue模块也有关系。在_thread模块缺失时可以使用dummy_threading模块。
在这个模块中定义了一些常用的方法:
threading.active_count() : 返回Thread对象的当前存活数。等同于enumerate()方法返回的list的长度
threading.current_thread() :返回当前Thread对象,和调用者的
threading.get_ident() : 返回 当前thread 标识,非0整数,没有意义。
threading.enumerate() : 返回一个包含所有存活的thread对象的list,不包括终止了的和没有启动的线程。
threading.main_thread() : 返回 main thread对象。
17.1.1 Thread-Local data
线程的私有数据,要管理thread-local数据,需要创建一个 local实例或者local的子类实例来保存属性。
mydata = threading.local()
mydata.x = 1
class threading.local
17.1.2 Thread Objects
Thread类表示在一个独立的线程里运行的任务,有两种方式定义这个任务:传递一个可调用的对象给生成器,或者在子类中重写run()方法,即不传递可调用对象,则执行类的run方法。
创建完成之后,调用start()方法来启动该线程,启动之后则认为线程是 alive的,除非run()方法终止或者抛出异常。
可以调用一个线程的join()方法,该方法会阻塞调用线程(主线程)直到被调用线程的join()方法停止。
线程可以有名字,可以在创建过程中传递,也可以通过name属性来读取和修改。
线程可以标识为 daemon线程,表示整个python程序退出之后,daemon线程仍保持。
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
该生成器应该带关键字参数调用,参数如下:
group: 为None,作为保留,后续ThreadGroup类被创建后扩展使用
target: 传递一个被run()方法调用的可调用对象。
name: 线程名字,默认是Thread-N
args: 是调用对象的参数,为元组对象(),只有一个参数时:(a,)
kwargs: 是一个关键字参数对象,默认是dict {}
daemon: 默认为None,如果为None则继承创建的线程的该属性。
start(): 启动线程任务
run(): 启动线程之后执行的任务,可以在子类中重写这个函数。
join(): 等待线程结束,calling线程一直阻塞直到调用的join()方法停止,或者超时,可以通过is_alive来判定是超时或者正常停止和异常退出。在start之前或者进入一个死循环会导致线程超时
getName()
setName()
ident(): 线程标识。
is_alive(): 确认线程是否存活
daemon: 布尔值,标识线程是否是一个daemon线程(True 是),必须在启动前设置该值。
isDaemon()
setDaemon()
17.1.3 Lock Objects
class threading.Lock
17.1.4 Rlock Objects
done
python多进程和多线程编程的更多相关文章
- Python多进程与多线程编程及GIL详解
介绍如何使用python的multiprocess和threading模块进行多线程和多进程编程. Python的多进程编程与multiprocess模块 python的多进程编程主要依靠multip ...
- python多进程与多线程编程
进程(process)和线程(thread)是非常抽象的概念.多线程与多进程编程对于代码的并发执行,提升代码运行效率和缩短运行时间至关重要.下面介绍一下python的multiprocess和thre ...
- Python中的多线程编程,线程安全与锁(二)
在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ...
- Python多进程和多线程是鸡肋嘛?【转】
GIL是什么 Python的代码执行由 Python虚拟机(也叫解释器主循环,CPython版本)来控制,Python在设计之初就考虑到在解释器的主循环中,同时只有一个线程在运行.即每个CPU在任意时 ...
- python多进程和多线程
多任务才有多进程和线程: 线程是最小的执行单元,而进程由至少一个线程组成.如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间. 多进程和多线程的程序涉及到同步.数据共享 ...
- Python多进程vs多线程
多任务的两种方式:多进程和多线程. 如果用多进程实现Master-Worker,主进程就是Master,其他进程就是Worker. 如果用多线程实现Master-Worker,主线程就是Master, ...
- Python中的多线程编程,线程安全与锁(一)
1. 多线程编程与线程安全相关重要概念 在我的上篇博文 聊聊Python中的GIL 中,我们熟悉了几个特别重要的概念:GIL,线程,进程, 线程安全,原子操作. 以下是简单回顾,详细介绍请直接看聊聊P ...
- Python多进程、多线程和协程简介
一.进程和线程 进程是一个执行中的程序.每个进程都拥有自己的地址空间.内存.数据栈以及其他用于跟踪执行的辅助数据.在单核CPU系统中的多进程,内存中可以有许多程序,但在给定一个时刻只有一个程序在运行: ...
- python 多进程和多线程的区别
了解线程和进程 进程 程序:磁盘上的可执行二进制文件,并无运行状态. 进程:就是一个正在运行的任务实例(存活在内存里). 获取当前电脑的CPU核心数: pip install psutil >& ...
随机推荐
- Python按行输出文件内容具体解释及延伸
下面两端測试代码分别为笔者所写,第一段为错误版本号.后者为正确版本号: #! /usr/bin/python2.7 try: filename = raw_input('please inpu ...
- struts <s:iterator>两个list嵌套循环,对象属性交叉使用
两个list:List<CreateTableColumn> createTableColumnList,List<Map<String, Object>> tab ...
- 【bzoj4538】[Hnoi2016]网络
我们考虑树剖,线段树上维护一个堆,保存不经过该段区间的路径的权值. 对于一条路径我们将对于线段树中的区间提取出来,在对于线段树中进行修改.也就是在堆中插入或删除. 对于一次询问,只要找到包含该点的线段 ...
- UnicodeEncodeError:'latin-1' codec can't encode character
UnicodeEncodeError:'latin-1' codec can't encode character
- InfluxDB存储引擎Time Structured Merge Tree——本质上和LSM无异,只是结合了列存储压缩,其中引入fb的float压缩,字串字典压缩等
The New InfluxDB Storage Engine: Time Structured Merge Tree by Paul Dix | Oct 7, 2015 | InfluxDB | 0 ...
- java 语法 —— 数组
1. 编译器不允许指定数组的大小 int[] a1; 既然编译器不允许指定数组的大小,现在 a1 拥有的只是对数组的一个引用,且未给该数组对象本身分配任何空间.为了给数组创建对应的存储空间,必须写初始 ...
- LD_LIBRARY_PATH设置问题
今天突然遇到设置LD_LIBRARY_PATH的问题,,发现在.bashrc和/etc/profile中添加 exportLD_LIBRARY_PATH = path_name:$LD_LIBRARY ...
- Linux中的LVM
逻辑卷管理器,通过将另外一个硬盘上的分区加到已有文件系统,来动态地向已有文件系统添加空间的方法. 逻辑卷管理的核心是处理安装在系统上的硬盘分区.在逻辑卷管理的世界里,硬盘称作物理卷(Physical ...
- Flask-SQLAlchemy - 不使用外键连表查询。记得常回来看我
前言 相比于 Django 的 ORM ,SQLAlchemy "不依靠外键进行跨表联查" 的解决方案就比较多. 没啥好说的,只能怪自己学艺不精.. _(:з」∠)_ 解决办法 ...
- bzoj 1650: [Usaco2006 Dec]River Hopscotch 跳石子【贪心+二分】
脑子一抽写了个堆,发现不对才想起来最值用二分 然后判断的时候贪心的把不合mid的区间打通,看打通次数是否小于等于m即可 #include<iostream> #include<cst ...