什么是线程?

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

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. python调用大漠插件教程03窗口绑定实例

    怎样利用注册好的大漠对象来绑定窗口? 直接上代码,根据代码分析 from win32com.client import Dispatch import os from win32gui import ...

  2. Java实现 蓝桥杯 传纸条

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个mm行nn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运 ...

  3. Java实现 蓝桥杯VIP 算法训练 暗恋

    算法训练 暗恋 时间限制:1.0s 内存限制:256.0MB 问题描述 同在一个高中,他却不敢去找她,虽然在别人看来,那是再简单不过的事.暗恋,是他唯一能做的事.他只能在每天课间操的时候,望望她的位置 ...

  4. Java实现 蓝桥杯VIP 算法提高 前10名

    算法提高 前10名 时间限制:1.0s 内存限制:256.0MB 问题描述 数据很多,但我们经常只取前几名,比如奥运只取前3名.现在我们有n个数据,请按从大到小的顺序,输出前10个名数据. 输入格式 ...

  5. Java实现 LeetCode 127 单词接龙

    127. 单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字 ...

  6. Java实现 蓝桥杯VIP 算法提高 进制转换

    算法提高 进制转换 时间限制:1.0s 内存限制:256.0MB 问题描述 程序提示用户输入三个字符,每个字符取值范围是0-9,A-F.然后程序会把这三个字符转化为相应的十六进制整数,并分别以十六进制 ...

  7. java实现第七届蓝桥杯有奖竞猜

    有奖竞猜 题目描述 小明很喜欢猜谜语. 最近,他被邀请参加了X星球的猜谜活动. 每位选手开始的时候都被发给777个电子币. 规则是:猜对了,手里的电子币数目翻倍, 猜错了,扣除555个电子币, 扣完为 ...

  8. OAuth2.0系列之基本概念和运作流程(一)

    @ 目录 一.OAuth2.0是什么? 1.1 OAuth2.0简介 1.2 OAuth2.0官方文档 二.OAuth2.0原理 2.1 OAuth2.0流程图 三. OAuth2.0的角色 四.OA ...

  9. Linux内核配置编译及基本调试方法

    一.Linux内核配置编译 1. 交叉编译设置:make ARCH=arm CROSS_COMPILE=arm-linux- 注:也可以直接修改顶层Makefile ARCH ?= arm CROSS ...

  10. Request 对象的主要方法

    setAttribute(String name,Object):设置名字为 name 的 request 的参数值 getAttribute(String name):返回由 name 指定的属性值 ...