什么是线程?

  线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务

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模块-多线程的更多相关文章

  1. python3 threading.Lock() 多线程锁的使用

    import threadingimport time lock = threading.Lock() #创建锁 def fun(data): try: lock.acquire(True) #锁定 ...

  2. Python3 多线程编程 threading模块

    性能自动化测试除了用jmeter还可以用python threading模块做 一.threading模块定义 Python 2.4中包含的较新的线程模块为线程提供了更强大的高级支持. 线程模块公开线 ...

  3. python 多线程编程之threading模块(Thread类)创建线程的三种方法

    摘录 python核心编程 上节介绍的thread模块,是不支持守护线程的.当主线程退出的时候,所有的子线程都将终止,不管他们是否仍在工作. 本节开始,我们开始介绍python的另外多线程模块thre ...

  4. python多线程与threading模块

    python多线程与_thread模块 中介绍了线程的基本概念以及_thread模块的简单示例.然而,_thread模块过于简单,使得我们无法用它来准确地控制线程,本文介绍threading模块,它提 ...

  5. Python:使用threading模块实现多线程编程

    转:http://blog.csdn.net/bravezhe/article/details/8585437 Python:使用threading模块实现多线程编程一[综述] Python这门解释性 ...

  6. Python多线程(threading模块)

    线程(thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. ...

  7. threading模块,python下的多线程

    一.GIL全局解释器锁 In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple nativ ...

  8. python threading模块使用 以及python多线程操作的实践(使用Queue队列模块)

    今天花了近乎一天的时间研究python关于多线程的问题,查看了大量源码 自己也实践了一个生产消费者模型,所以把一天的收获总结一下. 由于GIL(Global Interpreter Lock)锁的关系 ...

  9. 2016/1/3 Python中的多线程(2):threading模块

    之前提了Python多线程的一点使用,今天介绍更好的threading模块,它提供了Thread类和一些比较好用的同步机制. 先介绍Thread类 threading模块中的Thread类有很多thr ...

  10. python学习笔记之使用threading模块实现多线程(转)

    综述 Python这门解释性语言也有专门的线程模型,Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,但暂时无法利用多处理器的优势 ...

随机推荐

  1. MyBatis主配置文件

    MyBatis的使用非常简单,使用流程整体可以分成以下四步: public class UserDaoTest { private SqlSessionFactory sqlSessionFactor ...

  2. vscode jshint 报'import' is only available in ES6 (use 'esversion: 6'). (W119)错误

    vue项目用vscode打开代码前出现黄点,js报错 'import' is only available in ES6 (use 'esversion: 6'). (W119) 意思是import属 ...

  3. 啪啪,打脸了!领导说:try-catch必须放在循环体外!

    哈喽,亲爱的小伙伴们,技术学磊哥,进步没得说!欢迎来到新一期的性能解读系列,我是磊哥. 今天给大家带来的是关于 try-catch 应该放在循环体外,还是放在循环体内的文章,我们将从性能和业务场景分析 ...

  4. Spring boot Sample 001之spring-boot-begin-hello

    一.环境 1.1.Idea 2020.1 1.2.JDK 1.8 二.目的 初识Spring Boot 三.步骤 3.1.点击File -> New Project -> Spring I ...

  5. 如何从0创建一个react项目

    1. 确保本机电脑安装了yarn和node: 2. 在需要安装的文件夹目录下输入:create-react-app  +(项目名称): PS:上图使用的软件为webStorm 3. 此时一个简单的re ...

  6. JAVASE(十一) 高级类特性: abstract 、模板模式、interface、内部类、枚举、注解

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.关键字 abstract 1.1.abstract可以修饰:类,方法 1.2.abstract修饰方 ...

  7. Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)

    804. 唯一摩尔斯密码词 国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如: "a" 对应 ".-", " ...

  8. Java实现 蓝桥杯 算法训练 谁干的好事?

    试题 算法训练 谁干的好事? 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 ABCDE中num个人做了好事,truth个人说真话. A说:"我和X中有且只有一个做了好事& ...

  9. Java实现蓝桥杯VIP 算法训练 P0501

    试题 算法训练 P0501 资源限制 时间限制:1.0s 内存限制:256.0MB 输入两个无符号整数x, y, 用位操作实现无符号整数的乘法运算.不用考虑整数的溢出. 输入: 235 657 输出: ...

  10. Java实现 LeetCode 100 相同的树

    100. 相同的树 给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入: 1 1 / \ / \ 2 3 2 3 [ ...