python中线程嵌套进程_python 多线程和多进程

1 概念梳理:

1.1 线程

1.1.1 什么是线程

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。一个线程是一个execution context(执行上下文),即一个cpu执行时所需要的一串指令。

1.1.2 线程的工作方式

假设你正在读一本书,没有读完,你想休息一下,但是你想在回来时恢复到当时读的具体进度。有一个方法就是记下页数、行数与字数这三个数值,这些数值就是execution context。如果你的室友在你休息的时候,使用相同的方法读这本书。你和她只需要这三个数字记下来就可以在交替的时间共同阅读这本书了。

线程的工作方式与此类似。CPU会给你一个在同一时间能够做多个运算的幻觉,实际上它在每个运算上只花了极少的时间,本质上CPU同一时刻只干了一件事。它能这样做就是因为它有每个运算的execution context。就像你能够和你朋友共享同一本书一样,多任务也能共享同一块CPU。

1.2 进程

一个程序的执行实例就是一个进程。每一个进程提供执行程序所需的所有资源。(进程本质上是资源的集合)

一个进程有一个虚拟的地址空间、可执行的代码、操作系统的接口、安全的上下文(记录启动该进程的用户和权限等等)、唯一的进程ID、环境变量、优先级类、最小和最大的工作空间(内存空间),还要有至少一个线程。

每一个进程启动时都会最先产生一个线程,即主线程。然后主线程会再创建其他的子线程。

与进程相关的资源包括:

内存页(同一个进程中的所有线程共享同一个内存空间)

文件描述符(e.g. open sockets)

安全凭证(e.g.启动该进程的用户ID)

1.3 进程与线程区别

1.同一个进程中的线程共享同一内存空间,但是进程之间是独立的。

2.同一个进程中的所有线程的数据是共享的(进程通讯),进程之间的数据是独立的。

3.对主线程的修改可能会影响其他线程的行为,但是父进程的修改(除了删除以外)不会影响其他子进程。

4.线程是一个上下文的执行指令,而进程则是与运算相关的一簇资源。

5.同一个进程的线程之间可以直接通信,但是进程之间的交流需要借助中间代理来实现。

6.创建新的线程很容易,但是创建新的进程需要对父进程做一次复制。

7.一个线程可以操作同一进程的其他线程,但是进程只能操作其子进程。

8.线程启动速度快,进程启动速度慢(但是两者运行速度没有可比性)。

2 多线程

2.1 线程常用方法

方法注释

start()

线程准备就绪,等待CPU调度

setName()

为线程设置名称

getName()

获取线程名称

setDaemon(True)

设置为守护线程

join()

逐个执行每个线程,执行完毕后继续往下执行

run()

线程被cpu调度后自动执行线程对象的run方法,如果想自定义线程类,直接重写run方法就行了

2.1.1 Thread类

1.普通创建方式

import threading

import time

def run(n):

print("task", n)

time.sleep(1)

print('2s')

time.sleep(1)

print('1s')

time.sleep(1)

print('0s')

time.sleep(1)

t1 = threading.Thread(target=run, args=("t1",))

t2 = threading.Thread(target=run, args=("t2",))

t1.start()

t2.start()

"""

task t1

task t2

2s

2s

1s

1s

0s

0s

"""

2.继承threading.Thread来自定义线程类

其本质是重构Thread类中的run方法

import threading

import time

class MyThread(threading.Thread):

def __init__(self, n):

super(MyThread, self).__init__() # 重构run函数必须要写

self.n = n

def run(self):

print("task", self.n)

time.sleep(1)

print('2s')

time.sleep(1)

print('1s')

time.sleep(1)

print('0s')

time.sleep(1)

if __name__ == "__main__":

t1 = MyThread("t1")

t2 = MyThread("t2")

t1.start()

t2.start()

2.1.2 计算子线程执行的时间

注:sleep的时候是不会占用cpu的,在sleep的时候操作系统会把线程暂时挂起。

join() #等此线程执行完后,再执行其他线程或主线程

threading.current_thread() #输出当前线程

import threading

import time

def run(n):

print("task", n,threading.current_thread()) #输出当前的线程

time.sleep(1)

print('3s')

time.sleep(1)

print('2s')

time.sleep(1)

print('1s')

strat_time = time.time()

t_obj = [] #定义列表用于存放子线程实例

for i in range(3):

t = threading.Thread(target=run, args=("t-%s" % i,))

t.start()

t_obj.append(t)

"""

由主线程生成的三个子线程

task t-0

task t-1

task t-2

"""

for tmp in t_obj:

t.join() #为每

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,可以使用多线程来加速2层for循环的执行。多线程是一种并发执行的方式,可以利用计算机的多核心来同时处理多个任务,提高程序的执行效率。 首先,我们需要使用Python内置的多线程模块`threading`来创建和管理线程。我们可以使用`threading.Thread`类创建一个线程对象,并定义一个线程函数来执行具体的任务。在任务函数中,我们可以通过2层for循环的方式来遍历需要处理的数据集,并执行相应的操作。 接下来,我们可以将数据集分成多个子集,每个子集分配给一个线程去处理。这样每个线程可以独立地处理自己的数据子集,从而实现并行处理。在每个线程中,我们可以使用2层嵌套的for循环来处理当前线程分配到的数据子集。 在每个线程中的for循环中,我们可以执行需要的操作,例如计算、数据处理等。当每个线程完成自己的任务后,我们可以通过线程的join()方法等待所有线程执行完毕,并将结果进行合并处理。 需要注意的是,多线程并不是适用于所有的场景。在Python中,由于全局解释器锁(GIL)的存在,多线程可能无法充分利用多核处理器的优势。如果任务是CPU密集型的,即大部分时间都在执行计算任务,那么使用多线程可能无法带来明显的加速效果。在这种情况下,可以考虑使用多进程来利用多核处理器提升性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值