Python-线程(1)
什么是线程
线程与进程都是虚拟单位,目的是为了更好的描述某种事物
进程与线程的区别
进程:资源单位
线程:执行单位
开启一个进程,一定会有一个线程,线程才是真正的执行者
- 进程间数据独立,线程间数据共享
- 进程间通信可以使用队列,线程间数据共享
- 线程cpu切换要比进程切换 快的多
开启线程
# coding=utf-8
from threading import Thread
from threading import current_thread
import time
'''
开启线程方式1:
'''
def task():
print(f"{current_thread().name} 线程开启")
time.sleep(1)
print(f"{current_thread().name} 线程结束")
if __name__ == '__main__':
for i in range(3):
t = Thread(target=task)
t.daemon = True
t.start()
# 判断子线程是否存活
print(t.is_alive())
print(t.isAlive())
print("主|")
'''
开启线程方式2:
'''
class MyThread(Thread):
def run(self):
print(f"{current_thread().name} 线程开启")
time.sleep(1)
print(f"{current_thread().name} 线程结束")
if __name__ == '__main__':
t = MyThread()
t.start()
Thread-1 线程开启
True
True
Thread-2 线程开启
True
True
Thread-3 线程开启
True
True
主|
线程对象的属性:
current_thread().name:表示当前线程的名字
t.daemon = True:线程的守护进程 跟着主线程一起死掉
t.is_alive() or t.isAlive():判断子线程是否存活
t.join():等待子线程结束
为什么要使用线程
节省内存资源
开启进程:会开辟一个名称空间,每开启一个进程都会占用一份内存资源
,会自带一个线程
开启线程:一个进程可以开启多个线程,线程的开销远小于进程
注意:进程不能实现并行,线程只能实现并发,进程可以实现并行
比喻:内存就像一个工厂,子进程就像是一个个工厂车间,线程就像车间内的流水线
线程之间数据是共享的
线程互斥锁
# coding=utf-8
from threading import Thread,current_thread,Lock
import time
n = 100
'''
线程中数据时共享的,如果不加锁,那么每个线程抢到的资源都将是同一个,则不能保证数据的安全
'''
def task(i,mutex):
print(f"线程 {current_thread().name} 启动")
global n
# 添加线程互斥锁
mutex.acquire()
temp = n
time.sleep(0.1)
n = temp - 1
# 释放互斥锁
mutex.release()
print(f"线程 {current_thread().name} 结束")
# print(n)
if __name__ == '__main__':
mutex = Lock()
for i in range(10):
t = Thread(target=task,args=(i,mutex))
t.start()
t.join()
print(n)
线程 Thread-1 启动
线程 Thread-1 结束
线程 Thread-2 启动
线程 Thread-2 结束
线程 Thread-3 启动
线程 Thread-3 结束
线程 Thread-4 启动
线程 Thread-4 结束
线程 Thread-5 启动
线程 Thread-5 结束
线程 Thread-6 启动
线程 Thread-6 结束
线程 Thread-7 启动
线程 Thread-7 结束
线程 Thread-8 启动
线程 Thread-8 结束
线程 Thread-9 启动
线程 Thread-9 结束
线程 Thread-10 启动
线程 Thread-10 结束
90
Python-线程(1)的更多相关文章
- python——线程与多线程进阶
之前我们已经学会如何在代码块中创建新的线程去执行我们要同步执行的多个任务,但是线程的世界远不止如此.接下来,我们要介绍的是整个threading模块.threading基于Java的线程模型设计.锁( ...
- python——线程与多线程基础
我们之前已经初步了解了进程.线程与协程的概念,现在就来看看python的线程.下面说的都是一个进程里的故事了,暂时忘记进程和协程,先来看一个进程中的线程和多线程.这篇博客将要讲一些单线程与多线程的基础 ...
- [python] 线程简介
参考:http://www.cnblogs.com/aylin/p/5601969.html 我是搬运工,特别感谢张岩林老师! python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件 ...
- PYTHON线程知识再研习A
前段时间看完LINUX的线程,同步,信息号之类的知识之后,再在理解PYTHON线程感觉又不一样了. 作一些测试吧. thread:模块提供了基本的线程和锁的支持 threading:提供了更高级别,功 ...
- Python 线程(threading) 进程(multiprocessing)
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- Python线程:线程的调度-守护线程
Python线程:线程的调度-守护线程 守护线程与普通线程写法上基本么啥区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程.在python中建议使用的是thread. ...
- python 线程(一)理论部分
Python线程 进程有很多优点,它提供了多道编程,可以提高计算机CPU的利用率.既然进程这么优秀,为什么还要线程呢?其实,仔细观察就会发现进程还是有很多缺陷的. 主要体现在一下几个方面: 进程只能在 ...
- python线程同步原语--源码阅读
前面两篇文章,写了python线程同步原语的基本应用.下面这篇文章主要是通过阅读源码来了解这几个类的内部原理和是怎么协同一起工作来实现python多线程的. 相关文章链接:python同步原语--线程 ...
- Python学习——Python线程
一.线程创建 #方法一:将要执行的方法作为参数传给Thread的构造方法 import threading import time def show(arg): time.sleep(2) print ...
- Python 线程和进程和协程总结
Python 线程和进程和协程总结 线程和进程和协程 进程 进程是程序执行时的一个实例,是担当分配系统资源(CPU时间.内存等)的基本单位: 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其 ...
随机推荐
- spark-sql性能优化之——动态实现多个列应用同一个函数
在对一个dataframe的多个列实现应用同一个函数时,是否能动态的指定? 例如: 对A,B,C三列实现分组统计 1.初始化spark,构建DF val spark = SparkSession.bu ...
- 使用Pyppeteer进行gmail模拟登录
import asyncio import time from pyppeteer import launch async def gmailLogin(username, password, url ...
- IntelliJ IDEA(的springboot项目)环境准备(配置maven和jdk)
1.配置maven .使用自己电脑上装的maven版本,而非默认的.(方法一) (1)选择configure--Settings (2)搜索maven,配置3.6.2版本的maven.注意:将mave ...
- 2-MySQL高级-事务-基本概念(1)
事务 1. 为什么要有事务 事务广泛的运用于订单系统.银行系统等多种场景 例如: A用户和B用户是银行的储户,现在A要给B转账500元,那么需要做以下几件事: 检查A的账户余额>500元: A ...
- palindrome 回文 /// Manacher算法
判断最长不连续回文 #include <bits/stdc++.h> using namespace std; int main() { ]; while(gets(ch)) { ],an ...
- 基于第三方开源库的OPC服务器开发指南(4)——后记:与另一个开源库opc workshop库相关的问题
平心而论,我们从样例服务器的代码可以看出,利用LightOPC库开发OPC服务器还是比较啰嗦的,网上有人提出opc workshop库就简单很多,我千辛万苦终于找到一个05年版本的workshop库源 ...
- cvErode和cvDilate腐蚀和膨胀函数
Erode腐蚀,Dilate膨胀,这两个形态学函数总是成对出现,前者可以消除较小独点如噪音,后者可以使不连通的图像合并成块. void cvErode( const CvArr* src, CvArr ...
- FaceNet pre-trained模型以及FaceNet源码使用方法和讲解
Pre-trained models Model name LFW accuracy Training dataset Architecture 20180408-102900 0.9905 CASI ...
- microk8s 1.14本地Registry及DNS配置
microk8s 从1.14 开始, 使用containerd 代替原来自带的microk8s.docker, 据说是出于性能和与主机docker共存的考虑. 使用本地Registry加速镜像 mic ...
- Python代码中func(*args, **kwargs)
这是Python函数可变参数 args及kwargs *args表示任何多个无名参数,它是一个tuple **kwargs表示关键字参数,它是一个dict 测试代码如下: def foo(*args, ...