一 线程的基本概念

1.1 进程和线程

进程是资源分配的最小单位

线程是计算机中调度的最小单位

进程池:

开启过多的进程并不一走提高你的效率,

如果cp负载任务过多,平均单个任务执行的效率就会低,反而降低执行速度

  • 1个人做4件事,4个人做4件事,4个人做1件事
  • 显然后者执行速度更快,
  • 前者是并发,后者是并行
  • 利用进程池,可以开启cpu的并行效果

开启进程

  1. apply 开启进程,同步阻塞,每欠都都要等待当前任务完成之后,在开启下一个进程
  2. apply_async 开启进程,异步非咀塞,(主进程和子进程异步

1.2 线程的缘起

  • 资源分配需要分配内存空间,分配cpu
  • 分配的内存空间存放着临时要处理的数据等,比如要执行的代码,数据
  • 而这些内存空间是有限的,不能无限分配
  • 目前配置高的主机,5万个并发已是上限线程概念应用而生

1.3 线程的特点

  1. 线程是比较轻量级,能干更多的活,一个进程中的所有线程沒源是共享的
  2. 一个进程至少有一个线程在工作

二 线程的基本使用

2.1 一个进程可以有多个线程,共享同一份资源

from threading import Thread
from multiprocessing import Process
import random,time,os def func(num):
time.sleep(random.uniform(0.1,1))
print("子线程",num,os.getpid()) for i in range(10):
t = Thread(target=func,args=(i,))
t.start()

执行

[root@node10 python]# python3 test.py
子线程 7 4937
子线程 9 4937
子线程 6 4937
子线程 1 4937
子线程 5 4937
子线程 8 4937
子线程 0 4937
子线程 3 4937
子线程 4 4937
子线程 2 4937

2.2 并发多线程 和 并发多进程 的速度对比

多线程更快

计算线程的时间

from threading import Thread
from multiprocessing import Process
import random,time,os def func(i):
# time.sleep(random.uniform(0.1,1))
print("子线程",i,os.getpid()) # starttime = time.time()
# endtime = time.time()
# 1.计算多线程的时间
startime = time.perf_counter()
lst = []
for i in range(10000):
t = Thread(target=func,args=(i,))
t.start()
lst.append(t) for i in lst:
i.join() endtime = time.perf_counter()
print(endtime-startime,"主线程执行结束===================")

执行跑一万个线程

[root@node10 python]# python3 test.py

计算多进程的时间

from threading import Thread
from multiprocessing import Process
import random,time,os def func(i):
# time.sleep(random.uniform(0.1,1))
print("子线程",i,os.getpid()) # starttime = time.time()
# endtime = time.time()
# 1.计算多线程的时间
startime = time.perf_counter()
lst = []
for i in range(1000):
t = Thread(target=func,args=(i,))
t.start()
lst.append(t) for i in lst:
i.join() endtime = time.perf_counter()
print(endtime-startime,"主线程执行结束===================") startime = time.perf_counter()
lst = []
for i in range(1000):
p = Process(target=func,args=(i,))
p.start()
lst.append(p) for i in lst:
i.join() endtime = time.perf_counter()
print(endtime-startime,"主进程执行结束======================")

执行

线程时间

进程时间

2.3 多线程共享同一份进程资源

from threading import Thread
from multiprocessing import Process
import random,time,os num = 100 lst = []
def func(i):
global num
num -= 1
for i in range(100):
t =Thread(target=func,args=(i,))
t.start()
lst.append(t)
for i in lst:
i.join()
print(num)

执行

[root@node10 python]# python3 test.py
0

三  线程相关函数

  • 线程.is_alive() 检测线程是否仍然存在
  • 线程.setName() 设置线程名字
  • 线程.getName() 获取线程名字
  • 1.currentThread().ident 查看线程id号
  • 2.enumerate() 返回目前正在运行的线程列表
  • 3.activeCount() 返回目前正在运行的线程数量

3.1 线程.is_alive()

from threading import Thread
from multiprocessing import Process
import random,time,os def func():
pass
t = Thread(target=func)
t.start()
print(t.is_alive())

执行

[root@node10 python]# python3 test.py
False

修改

from threading import Thread
from multiprocessing import Process
import random,time,os def func():
time.sleep(0.5)
t = Thread(target=func)
t.start()
print(t.is_alive())

执行

[root@node10 python]# python3 test.py
True

3.2 setName() 和getName()

from threading import Thread
from multiprocessing import Process
import random,time,os def func():
time.sleep(0.5)
t = Thread(target=func)
t.start()
print(t.is_alive())
t.setName("消费者")
print (t.getName())

执行

[root@node10 python]# python3 test.py
True
消费者

3.3 currentThread().ident 查看线程id号

from threading import Thread,currentThread
from multiprocessing import Process
import random,time,os def func():
print ("子线程:",currentThread().ident)
t = Thread(target=func)
t.start()
print ("主线程:",currentThread().ident,os.getpid())

执行

[root@node10 python]# python3 test.py
子线程: 140242991515392
主线程: 140243176634176 41240

3.4 enumerate()返回目前正在运行的线程列表

from threading import Thread,currentThread,enumerate
from multiprocessing import Process
import random,time,os def func():
print ("子线程:",currentThread().ident)
time.sleep(0.5)
for i in range(10):
t = Thread(target=func)
t.start()
print (enumerate())

执行

子线程: 140043211654912
子线程: 140043203262208
子线程: 140043194869504
子线程: 140042978719488
子线程: 140042970326784
子线程: 140042961934080
子线程: 140042953541376
子线程: 140042945148672
子线程: 140042936755968
子线程: 140042928363264
[<_MainThread(MainThread, started 140043396773696)>,
<Thread(Thread-1, started 140043211654912)>,
<Thread(Thread-2, started 140043203262208)>,
<Thread(Thread-3, started 140043194869504)>,
<Thread(Thread-4, started 140042978719488)>,
<Thread(Thread-5, started 140042970326784)>,
<Thread(Thread-6, started 140042961934080)>,
<Thread(Thread-7, started 140042953541376)>,
<Thread(Thread-8, started 140042945148672)>,
<Thread(Thread-9, started 140042936755968)>,
<Thread(Thread-10, started 140042928363264)>]
11

3.5 activeCount() 返回目前正在运行的线程数量

from threading import Thread,currentThread,enumerate
from multiprocessing import Process
import random,time,os from threading import activeCount
def func():
print ("子线程:",currentThread().ident)
time.sleep(0.5)
for i in range(10):
t = Thread(target=func)
t.start()
print (enumerate())
print(activeCount())

执行

[root@node10 python]# python3 test.py
子线程: 140087921592064
子线程: 140087913199360
子线程: 140087904806656
子线程: 140087896413952
子线程: 140087888021248
子线程: 140087539005184
子线程: 140087530612480
子线程: 140087522219776
子线程: 140087513827072
子线程: 140087505434368
[<_MainThread(MainThread, started 140088106710848)>, <Thread(Thread-1, started 140087921592064)>, <Thread(Thread-2, started 140087913199360)>, <Thread(Thread-3, started 140087904806656)>, <Thread(Thread-4, started 140087896413952)>, <Thread(Thread-5, started 140087888021248)>, <Thread(Thread-6, started 140087539005184)>, <Thread(Thread-7, started 140087530612480)>, <Thread(Thread-8, started 140087522219776)>, <Thread(Thread-9, started 140087513827072)>, <Thread(Thread-10, started 140087505434368)>]
11

3.6 守护线程

等待所有线程执行结束之后,在自动结束,守护所有线程

from threading import Thread
import time def func1():
#这里定义一个死循环,可以一直跑
while True:
print ("This is Thread 1,func1")
def func2():
print ("This is Thread 2,and I will start run")
time.sleep(0.05)
print ("This is Thread 2,and I have aready end") #启动线程1
t1 = Thread(target=func1)
#因为线程1是死循环状态,可以给这个线程设置一个守护线程,当所有线程都执行完,结束这个线程
t1.setDaemon(True)
t1.start()
#启动线程2
t2 = Thread(target=func2)
t2.start()
print("Main Thread has aready stop run")

043.Python线程基本介绍的更多相关文章

  1. python——线程与多线程进阶

    之前我们已经学会如何在代码块中创建新的线程去执行我们要同步执行的多个任务,但是线程的世界远不止如此.接下来,我们要介绍的是整个threading模块.threading基于Java的线程模型设计.锁( ...

  2. Python 科学计算-介绍

    Python 科学计算 作者 J.R. Johansson (robert@riken.jp) http://dml.riken.jp/~rob/ 最新版本的 IPython notebook 课程文 ...

  3. Python 基于python操纵zookeeper介绍

    基于python操纵zookeeper介绍 by:授客  QQ:1033553122 测试环境 Win7 64位 Python 3.3.4 kazoo-2.6.1-py2.py3-none-any.w ...

  4. python 线程、多线程

    复习进程知识: python:主进程,至少有一个主线程 启动一个新的子进程:Process,pool 给每一个进程设定一下执行的任务:传一个函数+函数的参数 如果是进程池:map函数:传入一个任务函数 ...

  5. 对Python线程池

    本文对Python线程池进行详细说明介绍,IDE选择及编码的解决方案进行了一番详细的描述,实为Python初学者必读的Python学习经验心得. AD: 干货来了,不要等!WOT2015 北京站演讲P ...

  6. python线程条件变量Condition(31)

    对于线程与线程之间的交互我们在前面的文章已经介绍了 python 互斥锁Lock / python事件Event , 今天继续介绍一种线程交互方式 – 线程条件变量Condition. 一.线程条件变 ...

  7. python线程池ThreadPoolExecutor(上)(38)

    在前面的文章中我们已经介绍了很多关于python线程相关的知识点,比如 线程互斥锁Lock / 线程事件Event / 线程条件变量Condition 等等,而今天给大家讲解的是 线程池ThreadP ...

  8. python 线程队列PriorityQueue(优先队列)(37)

    在 线程队列Queue / 线程队列LifoQueue 文章中分别介绍了先进先出队列Queue和先进后出队列LifoQueue,而今天给大家介绍的是最后一种:优先队列PriorityQueue,对队列 ...

  9. python 线程队列LifoQueue-LIFO(36)

    在 python线程队列Queue-FIFO  文章中已经介绍了 先进先出队列Queue,而今天给大家介绍的是第二种:线程队列LifoQueue-LIFO,数据先进后出类型,两者有什么区别呢? 一.队 ...

随机推荐

  1. Spring Boot 2.4 配置文件将加载机制大变化

    Spring Boot 2.4.0.M2 刚刚发布,它对 application.properties 和 application.yml 文件的加载方式进行重构.如果应用程序仅使用单个 applic ...

  2. (十八)VMware Harbor 镜像同步

    为什么需要镜像同步 由于对镜像的访问是一个核心的容器概念,在实际使用过程中,一个镜像库可能是不够用的,下例情况下,我们可能会需要部署多个镜像仓库: 国外的公有镜像下载过慢,需要一个中转仓库进行加速 容 ...

  3. C++ Primer Plus(第6版)中文版电子版awz+epub+mobi三版

    电子书资源:C++ Primer Plus(第6版)中文版 书籍简介:   C++是在C语言基础上开发的一种集面向对象编程.通用编程和传统的过程化编程于一体的编程语言,是C语言的超集.<C++ ...

  4. JAVAEE_Servlet_20_登录注册功能

    实现登录注册功能 注册功能 import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import j ...

  5. Faiss源码剖析:类结构分析

    摘要:在下文中,我将尝试通过Faiss源码中各种类结构的设计来梳理Faiss中的各种概念以及它们之间的关系. 本文分享自华为云社区<Faiss源码剖析(一):类结构分析>,原文作者:HW0 ...

  6. OAuth 2.0、OIDC 原理

    OAuth 目录 OAuth 什么是 OAuth? 为什么是 OAuth? SAML OAuth 和 API OAuth 主要组件 OAuth 作用域 OAuth 参与者 OAuth 令牌 OAuth ...

  7. 进程保护原理Hook函数Openprocess

    Win32子系统:                                                                                            ...

  8. 从苏宁电器到卡巴斯基第24篇:难忘的三年硕士时光 II

    没办法,还是先打好基础吧 其实在我知道自己面试失败后,第一个想法就是将面试官问我的问题都总结出来,然后通过查权威的资料,找出所有问题的答案,背下所有的答案,大概过一到两个月吧,再面试金山.当时我是这么 ...

  9. 将Android源码导入eclipse中的方法以及编译Android源码指定模块

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53365659 将android源码导入eclipse.androidstudio. ...

  10. hdu3449 有依赖的背包问题

    题意:       给你一些物品,每个物品有自己的价值和花费,每个物品都对应一个箱子,每个箱子有价钱,买这个物品必须买相应的箱子,给你一个价钱,问最多可以获得多少价值 <提示:多个物品可能同时对 ...