初识python:多线程
多线程:在一个程序中,独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。即:一个进程中,多个线程。
举个例说明:就像是一列火车就是一个“进程”(程序),火车的每一节车厢就是一个“线程”。每个线程可以独立的做一些事情。
python 中 threading 模块提供了多线程编程方法。
threading.enumerate() 查看当前线程的数量
threading.current_thread() 查看当前线程的信息
下面通过两种方式加以说明“多线程”模式。
功能:运行两个“功能”,一个“写”,一个“画”。
一、传统方式
def coding():
for i in range(3):
print('正在写入:',i)
time.sleep(1) def drawing():
for i in range(3):
print('正在画图:',i)
time.sleep(1) def main():
coding()
drawing() if __name__ == '__main__':
main()
执行结果: 一个一个执行,共耗时6s。

二、多线程方式
def coding():
for i in range(3):
print('正在写入:',i)
print(threading.current_thread()) # 查看当前线程的名字
time.sleep(1) def drawing():
for i in range(3):
print('正在画图:',i)
print(threading.current_thread()) # 查看当前线程的名字
time.sleep(1) # 多线程方式执行
def thread():
t1 = threading.Thread(target=coding) # 注意,此处target传入的是一个函数(coding就是一个函数),不是函数的返回值(coding()是函数的返回值)
t2 = threading.Thread(target=drawing)
t1.start()
t2.start()
print(threading.enumerate()) # 查看当前线程数量 # [<_MainThread(MainThread, started 7020)>, <Thread(Thread-1, started 2088)>, <Thread(Thread-2, started 7516)>] if __name__ == '__main__':
thread()
执行结果:两个同时执行,共耗时3s。

由上对比,可以看出:多线程执行效率比传统单线程方式的执行效率高很多。
多线程 threading.Thread 类 方法
class CodingThread(threading.Thread):
def run(self):
for i in range(3):
print('正在写入:', i)
print(threading.current_thread()) # 查看当前线程的名字
time.sleep(1) class DrawingThread(threading.Thread):
def run(self):
for i in range(3):
print('正在画图:', i)
print(threading.current_thread()) # 查看当前线程的名字
time.sleep(1) def main():
t1 = CodingThread()
t2 = DrawingThread()
t1.start()
t2.start() if __name__ == '__main__':
main()
执行结果:

多线程共享全局变量
多线程都是在同一个进程中运行的。因此在进程中的全局变量所有线程都是可共享的。这就造成了一个问题,因为线程执行的顺序是无序的。有可能会造成数据错误。比如以下代码:
VALUE = 0 # 定义全局变量
def add_value():
global VALUE # 指定是一个全局变量
for i in range(1000000):
VALUE += 1 # 修改全局变量值
print(VALUE) # 使用线程方式执行,两个线程同时执行 add_value
def main():
for x in range(2):
t = threading.Thread(target=add_value)
t.start() if __name__ == '__main__':
main()
执行结果:

锁机制:
变量名 = threading.Lock() # 创建锁
acquire() # 加锁
release() # 解锁
为了解决以上使用共享全局变量的问题。threading提供了一个Lock类,这个类可以在某个线程访问某个变量的时候加锁,其他线程此时就不能进来,直到当前线程处理完后,把锁释放了,其他线程才能进来处理。示例代码如下:
VALUE = 0 # 定义全局变量 # 创建锁
gLock = threading.Lock() def add_value():
global VALUE # 指定是一个全局变量
gLock.acquire() # 加锁
for i in range(1000000):
VALUE += 1 # 修改全局变量值
gLock.release() # 解锁
print(VALUE) # 使用线程方式执行
def main():
for x in range(2):
t = threading.Thread(target=add_value)
t.start() if __name__ == '__main__':
main()
执行结果:

初识python:多线程的更多相关文章
- 初识python多线程
目录 GIL锁 Thread类构造方法 Lock类.Rlock类 参考: python3多线程--官方教程中文版 python多线程-1 python多线程-2.1 python多线程-2.2 pyt ...
- Python导出Excel为Lua/Json/Xml实例教程(一):初识Python
Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...
- Python开发【第一篇】:初识Python
初识python 一.python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解 ...
- python多线程学习记录
1.多线程的创建 import threading t = t.theading.Thread(target, args--) t.SetDeamon(True)//设置为守护进程 t.start() ...
- python多线程编程
Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...
- Python 多线程教程:并发与并行
转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...
- python多线程
python多线程有两种用法,一种是在函数中使用,一种是放在类中使用 1.在函数中使用 定义空的线程列表 threads=[] 创建线程 t=threading.Thread(target=函数名,a ...
- Python开发【第二篇】:初识Python
Python开发[第二篇]:初识Python Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏 ...
- python 多线程就这么简单(转)
多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...
- python 多线程就这么简单(续)
之前讲了多线程的一篇博客,感觉讲的意犹未尽,其实,多线程非常有意思.因为我们在使用电脑的过程中无时无刻都在多进程和多线程.我们可以接着之前的例子继续讲.请先看我的上一篇博客. python 多线程就这 ...
随机推荐
- Windows服务器java.exe占用CPU过高问题分析及解决
最近在测试一个用java语言实现的数据采集接口时发现,接口一旦运行起来,CPU利用率瞬间飙升到85%-95%,一旦停止就恢复到40%以下,这让我不得不面对以前从未关注过的程序性能问题. 在硬着头皮查找 ...
- 使用fastDFS上传和下载图片文件
package com.xuecheng.test.fastdfs;import org.csource.common.MyException;import org.csource.fastdfs.* ...
- 商城项目的购物车模块的实现------通过session实现
1.新建购物车的实体类Cart public class Cart implements java.io.Serializable{ private Shangpin shangpin;//存放商品实 ...
- 对于React各种状态管理器的解读
首先我们要先知道什么是状态管理器,这玩意是干啥的? 当我们在多个页面中使用到了相同的属性时就可以用到状态管理器,将这些状态存到外部的一个单独的文件中,不管在什么时候想使用都可以很方便的获取. reac ...
- logcplus(2)
(一)log4cplus是C++编写的开源的日志系统,功能非常全面,用到自己开发的工程中会比较专业的,:),本文介绍了log4cplus基本概念,以及如何安装,配置. ### 简介 ### log4 ...
- 微信小程序项目使用npm安装vant-weapp的正确步骤,简单易懂!!
微信小程序项目使用npm安装vant-weapp的正确步骤 1.在当前小程序项目目录npm init -y 构建npm项目 2.运行命令 npm install vant-weapp -S --pro ...
- 统计图—柱状图可视化(python)
# 柱状图 import matplotlib.pyplot as plt import matplotlib as mpl mpl.rcParams['font.sans-serif']=['Fan ...
- 对Spring IOC容器的思考
最近在看Spring5的视频教学,学到了IOC容器这块,对IOC有些浅薄的理解,分享一二:有错误之处,还请大佬指出 IOC(Inversion of Control 控制反转),是面向对象编程中的一种 ...
- docker初识-docker安装、基于docker安装mysql及tomcat、基本命令
一.docker是什么 用go语言开发,开源的应用容器引擎,容器性能开销极低 二.整体架构图 Docker 包括三个基本概念: 镜像(Image):Docker 镜像(Image),就相当于是一个 r ...
- 小迪安全 Web安全 基础入门 - 第八天 - 信息打点-系统篇&端口扫描&CDN服务&负载均衡&WAF防火墙
一.获取网络信息-服务厂商&网络架构 1.通过whois查询获取. 2.nmap.goby等扫描工具扫描获取. 3.https://www.netcraft.com/等网站查询获取. 二.服务 ...