Python3-threading模块-多线程
什么是线程?
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务
Python3中实现多线程有两种方式
1.直接实例化threading.Thread线程对象,实现多线程
import threading
import time def print_age(who, age):
"""
需要用多线程调用的函数
:param who:
:param age:
:return:
"""
print("Hello,every one!")
time.sleep(1)
print("%s is %s years old !" % (who, age)) if __name__ == "__main__":
t1 = threading.Thread(target=print_age, args=("jet", 18, )) # 创建线程1
t2 = threading.Thread(target=print_age, args=("jack", 25, )) # 创建线程2
t3 = threading.Thread(target=print_age, args=("jack", 25,)) # 创建线程3
t1.start() # 运行线程1
t2.start() # 运行线程2
t3.start() # 运行线程3
print("over...")
2.通过继承threading.Thread,并重写run()方法,来实现多线程
import threading
import time class MyThread(threading.Thread):
"""
使用继承的方式实现多线程
"""
def __init__(self, who):
super().__init__() # 必须调用父类的构造方法
self.name = who def run(self):
print("%s is run..." % self.name)
time.sleep(3) if __name__ == "__main__":
t1 = MyThread("Jet") # 创建线程1
t2 = MyThread("Jack") # 创建线程2
t1.start() # 运行线程1
t2.start() # 运行线程2
print("over...")
守护线程
可以通过setDaemon()方法将线程设置为守护线程,当守护线程退出时,由它启动的其它子线程将同时退出,不管是否执行完成
import threading
import time def print_age(who, age):
print("Hello,every one!")
time.sleep(1)
print("%s is %s years old !" % (who, age)) def daemon_func():
for i in range(18, 25):
t = threading.Thread(target=print_age, args=("Jet", i,)) # 创建线程
t.start() if __name__ == "__main__":
dt = threading.Thread(target=daemon_func) # 创建线程
dt.setDaemon(True) # 设置为守护线程
dt.start()
dt.join(timeout=2)
print("over...")
线程锁
因为多线程是共享父进程里面的数据的,所以当多个线程同时修改一份数据的时候,就容易出错,因此就有了锁,锁能确保在同一时间只有一个线程修改这份数据
CPython的GIL(Global Interpreter Lock)是全局线程锁,是确保只有一个线程运行的,与这个锁没有关系,锁的层级不一样,GIL更为底层
# -*- coding: utf-8 -*-
import threading
import time def add_one():
global num
print("Value: %s" % num)
time.sleep(1)
lock.acquire() # 加锁
num += 1 # 修改数据
lock.release() # 释放锁 if __name__ == "__main__":
num = 0
lock = threading.RLock() # 一般都用RLock递归锁
thread_list = []
for i in range(100):
t = threading.Thread(target=add_one)
t.start()
thread_list.append(t)
for i in thread_list:
i.join()
print("Num = %s" % num)
信号量
信号量semaphore,是一个变量,控制着对公共资源或者临界区的访问。信号量维护着一个计数器,指定可同时访问资源或者进入临界区的线程数。用来控制最大线程数的
# -*- coding: utf-8 -*-
import threading
import time def add_one():
global num
semaphore.acquire() # 加锁,最多有五个线程做以下操作
time.sleep(1)
num -= 1
print("Value: %s" % num)
semaphore.release() # 释放锁 if __name__ == "__main__":
num = 100
thread_list = []
semaphore = threading.BoundedSemaphore(5) for i in range(100):
t = threading.Thread(target=add_one)
t.start()
thread_list.append(t)
for i in thread_list:
i.join() # 等待线程结束
print("Num = %s" % num)
参考资料
http://python.usyiyi.cn/translate/python_352/library/threading.html
Python3-threading模块-多线程的更多相关文章
- python3 threading.Lock() 多线程锁的使用
import threadingimport time lock = threading.Lock() #创建锁 def fun(data): try: lock.acquire(True) #锁定 ...
- Python3 多线程编程 threading模块
性能自动化测试除了用jmeter还可以用python threading模块做 一.threading模块定义 Python 2.4中包含的较新的线程模块为线程提供了更强大的高级支持. 线程模块公开线 ...
- python 多线程编程之threading模块(Thread类)创建线程的三种方法
摘录 python核心编程 上节介绍的thread模块,是不支持守护线程的.当主线程退出的时候,所有的子线程都将终止,不管他们是否仍在工作. 本节开始,我们开始介绍python的另外多线程模块thre ...
- python多线程与threading模块
python多线程与_thread模块 中介绍了线程的基本概念以及_thread模块的简单示例.然而,_thread模块过于简单,使得我们无法用它来准确地控制线程,本文介绍threading模块,它提 ...
- Python:使用threading模块实现多线程编程
转:http://blog.csdn.net/bravezhe/article/details/8585437 Python:使用threading模块实现多线程编程一[综述] Python这门解释性 ...
- Python多线程(threading模块)
线程(thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. ...
- threading模块,python下的多线程
一.GIL全局解释器锁 In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple nativ ...
- python threading模块使用 以及python多线程操作的实践(使用Queue队列模块)
今天花了近乎一天的时间研究python关于多线程的问题,查看了大量源码 自己也实践了一个生产消费者模型,所以把一天的收获总结一下. 由于GIL(Global Interpreter Lock)锁的关系 ...
- 2016/1/3 Python中的多线程(2):threading模块
之前提了Python多线程的一点使用,今天介绍更好的threading模块,它提供了Thread类和一些比较好用的同步机制. 先介绍Thread类 threading模块中的Thread类有很多thr ...
- python学习笔记之使用threading模块实现多线程(转)
综述 Python这门解释性语言也有专门的线程模型,Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,但暂时无法利用多处理器的优势 ...
随机推荐
- CVE-2016-3714-ImageMagick 漏洞利用
漏洞简介:/etc/ImageMagick/delegates.xml 将%s,%l加入到command里造成了命令执行 利用方式: poc代码: push graphic-context viewb ...
- Netty学习笔记(番外篇) - ChannelHandler、ChannelPipeline和ChannelHandlerContext的联系
这一篇是 ChannelHandler 和 ChannelPipeline 的番外篇,主要从源码的角度来学习 ChannelHandler.ChannelHandler 和 ChannelPipeli ...
- 使用turtle库绘制同心圆
import turtle as t t.pensize(3) t.setup(600,600,50,50) t.pencolor("yellow") t.penup() t.pe ...
- Java实现 LeetCode 693 交替位二进制数(位运算)
693. 交替位二进制数 给定一个正整数,检查他是否为交替位二进制数:换句话说,就是他的二进制数相邻的两个位数永不相等. 示例 1: 输入: 5 输出: True 解释: 5的二进制数是: 101 示 ...
- Java实现 LeetCode 128 最长连续序列
128. 最长连续序列 给定一个未排序的整数数组,找出最长连续序列的长度. 要求算法的时间复杂度为 O(n). 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连 ...
- Java实现 LeetCode 116 填充每个节点的下一个右侧节点指针
116. 填充每个节点的下一个右侧节点指针 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点.二叉树定义如下: struct Node { int val; Node *left ...
- java实现土地测量
** 土地测量** 造成高房价的原因有许多,比如土地出让价格.既然地价高,土地的面积必须仔细计算.遗憾的是,有些地块的形状不规则,比如是如图[1.jpg]中所示的五边形. 一般需要把它划分为多个三角形 ...
- java实现第八届蓝桥杯树型显示
树型显示 题目描述 对于分类结构可以用树形来形象地表示.比如:文件系统就是典型的例子. 树中的结点具有父子关系.我们在显示的时候,把子项向右缩进(用空格,不是tab),并添加必要的连接线,以使其层次关 ...
- 除了FastJson,你也应该了解一下Jackson(二)
概览 上一篇文章介绍了Jackson中的映射器ObjectMapper,以及如何使用它来实现Json与Java对象之间的序列化和反序列化,最后介绍了Jackson中一些序列化/反序列化的高级特性.而本 ...
- [xDebug] PhpStorm Xdebug远程调试环境搭建
对于简单的工程,直接print_r();exit()已经足够,但是对于大型项目有时就有点力不从心.. 1,环境介绍 本地:windows10(192.168..)+ phpstorm8远程:Cento ...