一.线程概念

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

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

 多线程(即多个控制线程)的概念是,在一个进程中存在多个控制线程,多个控制线程共享该进程的地址空间,相当于一个车间内有多条流水线,都共用一个车间的资源。(一个进程里面开多个线程(共享同一个进程里面的内存空间))

#线程的缘起

资源分配需要分配内存空间,分配cpu:

分配的内存空间存放着临时要处理的数据等,比如要执行的代码,数据

而这些内存空间是有限的,不能无限分配

目前配置高的主机,5万个并发已是上限.线程概念应用而生.

#线程的特点

线程是比较轻量级,能干更多的活,一个进程中的所有线程资源是共享的.

一个进程至少有一个线程在工作

### 线程的缺陷

#线程可以并发,但是不能并行(即可以1个cpu执行,不能多个cpu一起执行)

#原因:

python是解释型语言,执行一句编译一句,而不是一次性全部编译成功,不能提前规划,都是临时调度

容易造成不同的cpu却反复执行同一个程序.所以加了一把锁叫GIL

全局解释器锁(Cpython解释器特有) GIL锁:同一时间一个线程只能被一个cpu执行

#想要并行的解决办法:

(1)用多进程间接实现线程的并发

(2)换一个Pypy,Jpython解释器

#程序分为计算密集型和io密集型

对于计算密集型程序会过度依赖cpu,但网页,爬虫,OA办公,这种io密集型的程序里,python绰绰有余

### 线程相关函数

线程.is_alive()    检测线程是否仍然存在

线程.setName()     设置线程名字

线程.getName()     获取线程名字

currentThread().ident 查看线程id号

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

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

pyhton上是一个任务首先在一个进程上执行,在多个线程内循环执行,然后换到另外一个进程再继续执行,再循环线程,不停的切换,不能进行并行,可以的是进程并发操作,就是这个任务先暂停一下,先换成另外一个任务进程执行。

因为python中有一个GIL锁。

而java上的线程是,多个任务在多个线程上进行执行。不需要不停地进行更换,线程。

二.线程的基本语法

在下面开始之前都需要导入:

from threading import Thread

from multiprocessing import Process

import os, time, random

1.一个进程可以多个线程

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()

2.并发多线程和多进程的速度对比? 多线程更快

def func(i):

#time.sleep(random.uniform(0.1,1))

print("子线程",i,os.getpid())

if __name__ == "__main__":

# 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()

print("程序执行结束")

endtime = time.perf_counter()

print(endtime-startime) #0.2554951

# 2.计算多进程的执行速度

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()

print("程序执行结束")

endtime = time.perf_counter()

print(endtime-startime) #66.66021479999999

3.多线程共享同一份进程资源

最后得出的数值为0,说明资源共享。

例:

num = 100

lst = []

def func():

global num

num -= 1

for i in range(100):

t = Thread(target=func)

t.start()

lst.append(t)

for i in lst:

i.join()

print(num)

4.线程相关函数

线程.is_alive()   检测线程是否仍然存在

线程.setName()    设置线程名字

线程.getName()    获取线程名字

例:

def func():

#time.sleep(0.1)

pass

t = Thread(target=func)

t.start()

print(t.is_alive()) # False

print(t.getName()) #Thread-1

t.setName("hsz")

print(t.getName()) # hsz

time.sleep(2)

print(t.is_alive()) #False,线程已经结束了所有False

1.currentThread().ident 查看线程id

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

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

# 1.currentThread().ident 查看线程id号

from threading import current_thread

def func():

print("子线程:",current_thread().ident)

t = Thread(target=func)

t.start()

print("主线程:",current_thread().ident)

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

from threading import current_thread

from threading import enumerate

def func():

print("子线程:", current_thread().ident)

time.sleep(0.5)

for i in range(10):

t = Thread(target=func)

t.start()

print(len(enumerate()))

time.sleep(3)

# 10个子线程 + 1个主线程  =  11个正在运行的线程

print(enumerate())

print(len(enumerate()))

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

from threading import current_thread

from threading import activeCount

def func():

print("子线程:", current_thread().ident)

time.sleep(0.5)

for i in range(10):

t = Thread(target=func)

t.start()

print(activeCount())

三.守护线程

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

例:

from threading import Thread

import time

def func1():

while True:

time.sleep(0.5)

print("我是守护线程")

def func2():

print("func2 -> start")

time.sleep(3)

print("func2 -> end")

t1 = Thread(target=func1)

# setDaemon 讲t1线程对象变成守护线程

t1.setDaemon(True)

t1.start()

t2 = Thread(target=func2)

t2.start()

time.sleep(5)

print("主线程执行结束")

Python 之并发编程之线程上的更多相关文章

  1. python 之 并发编程(线程Event、协程)

    9.14 线程Event connect线程执行到event.wait()时开始等待,直到check线程执行event.set()后立即继续线程connect from threading impor ...

  2. Python 之并发编程之线程中

    四.线程锁lock(线程的数据安全) 在数据量较大的时候,线程中的数据会被并发,所有数据会不同步,以至于数据会异常. 下面还介绍了两种的上锁方法. 例: from threading import T ...

  3. Python 之并发编程之线程下

    七.线程局部变量 多线程之间使用threading.local 对象用来存储数据,而其他线程不可见 实现多线程之间的数据隔离 本质上就是不同的线程使用这个对象时,为其创建一个只属于当前线程的字典 拿空 ...

  4. Python 之并发编程之进程上(基本概念、并行并发、cpu调度、阻塞 )

    一: 进程的概念:(Process) 进程就是正在运行的程序,它是操作系统中,资源分配的最小单位. 资源分配:分配的是cpu和内存等物理资源 进程号是进程的唯一标识 同一个程序执行两次之后是两个进程 ...

  5. python 之 并发编程(线程理论,开启线程的两种方式,进程与线程的区别,线程对象的其他方法)

    9.9 线程理论 1.什么是线程 线程指的是一条流水线的工作过程 进程根本就不是一个执行单位,进程其实是一个资源单位,一个进程内自带一个线程,线程才是执行单位 2.进程VS线程 同一进程内的线程们共享 ...

  6. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...

  7. python并发编程之线程/协程

    python并发编程之线程/协程 part 4: 异步阻塞例子与生产者消费者模型 同步阻塞 调用函数必须等待结果\cpu没工作input sleep recv accept connect get 同 ...

  8. Python 3 并发编程多进程之队列(推荐使用)

    Python 3 并发编程多进程之队列(推荐使用) 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 可以往 ...

  9. Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

随机推荐

  1. Ubuntu16.04安装TORCS

    下载torch安装包: git clone https://github.com/torch/distro.git torch --recursive 安装依赖库: cd torch/ sudo ba ...

  2. EnumSet

    这个概念是在 Effective Java中了解到的, 可以通过EnumSet来代替位域这种方式表达.并不是很常见的概念, 因此记录下.如果在这之前恰好了解过 bitmap这种数据结构就更好了.不了解 ...

  3. Bugku-CTF分析篇-weblogic(黑客攻击了Weblogic应用,请分析攻击过程,找出Weblogic的主机名。)

    weblogic 黑客攻击了Weblogic应用,请分析攻击过程,找出Weblogic的主机名. flag格式:flag{} Tip:主机名为十六进制.  

  4. PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式

    $test=$_POST["test"]; $test= preg_replace("/(\n)|(\s)|(\t)|(\')|(')|(,)/" ,',' , ...

  5. Tika结合Tesseract-OCR 实现光学汉字识别(简体、宋体的识别率百分之百)—附Java源码、测试数据和训练集下载地址

     OCR(Optical character recognition) —— 光学字符识别,是图像处理的一个重要分支,中文的识别具有一定挑战性,特别是手写体和草书的识别,是重要和热门的科学研究方向.可 ...

  6. RS422接口与RS485接口

    RS422具体接线参考网站 RS485接口 RS485设备为半双工设备,RS485收发器信号相关引脚包括控制引脚.485A.485B,其中控制引脚的高低电平决定当前处于接收模式还是发送模式. RS48 ...

  7. pipreqs (找当前项目依赖的包)

    pipreqs pipreqs可以帮你找到当前项目的所有组件及其版本.就是当别人给你一个程序的时候,你要在自己电脑上运行起来,就需要安装程序所依赖的组件,总不能自己一个一个找吧. # 安装 pip3 ...

  8. django模块导入/函数/中间件/MVC和MTV/CSRF

    目录 一:模块导入 二:函数 三:中间件 四:MVC和MTV 五:csrf 一:模块导入 第一种:继承 这里的母版更像是一个架子,子板都是定义的内容(如果多个页面中 ,存在相同的页面:这样我们可以抽到 ...

  9. 创建jsp文件时报错,"javax.servlet.http.HttpServlet" was not found on the Java)

    原因: 创建jsp文件的步骤如下: 出现"javax.servlet.http.HttpServlet" was not found on the Java) 报错信息就是因为没有 ...

  10. 《JavaScript高级程序设计》读书笔记(三)基本概念第二小节 Number类型

    内容---语法 上一小节---数据类型 本小节 number类型---流程控制语句---理解函数 number类型--使用IEEE754格式来表示整数和浮点数值(双精度数值)--规定了数值字面量格式, ...