进程与线程面试总结(python)

Python 笔记 Python 常见面试题 线程: 操作系统能够进行运算调度的最小单位。 它包含在进程之中,是进程的实际运作单位。 一条线程指的是进程中一个单一顺序的控制流, 一个进程中可以并发多个线程,每一条线程并行执行不同的任务。 进程: 对一堆资源的整合。 比如说QQ就是一个进程。 目的:最大限度的利用CPU,节省时间。 从操作系统角度来讲,进程是资源分配单元,线程是执行单元,多个线程可以共享所在进程的资源。 协程: 从程序运行角度出发,是由用户(程序)控制和调度的一个过程。 多线程并不会充 阅读详情

问题1 :简述线程同步和异步的区别?

同步:指一个线程需要等待上一个线程执行完之后才开始执行。

异步:指一个线程不需要待上一个线程执行完之后就开始执行。

问题2 :简述线程和进程的区别?

线程:

操作系统能够进行运算调度的最小单位。 它包含在进程之中,是进程的实际运作单位。 一条线程指的是进程中一个单一顺序的控制流, 一个进程中可以并发多个线程,每一条线程并行执行不同的任务。

进程:
对一堆资源的整合。 比如说QQ就是一个进程。
目的:最大限度的利用CPU,节省时间。

多线程并不会充分调用两个CPU,而是会在一个CPU上充分运转;
而多进程则是会完全调用两个CPU,同时执行;

并行:多个CPU同时执行多个任务,就好像有两个程序,这两个程序是真的在两个不同的CPU内同时被执行。

并发:CPU交替处理多个任务,还是有两个程序,但是只有一个CPU,会交替处理这两个程序,而不是同时执行,只不过因为CPU执行的速度过快,而会使得人们感到是在“同时”执行,执行的先后取决于各个程序对于时间片资源的争夺。

问题3 :python如何开启一个进程?

知识点一:进程的理论

什么是进程?

进程是指一个程序在一个数据集上的动态执行过程(程序执行过程的抽象)

进程包含

  • 程序:我们通过程序来描述一个进程所要执行的内容以及如何执行

  • 数据集:数据集代表程序在执行过程中所需要的资源

  • 进程控制块:用于描述进程的外部特征,记录进程的执行过程,系统可以用来控制/管理进程,也是操作系统感知进程存在的唯一标识

进程运行的的三种状态:

在这里插入图片描述

  1. 进程执行过程中出现IO,进入阻塞状态(操作系统强行剥夺CPU)

  2. 进程占用CPU时间过长/出现一个优先级更高的进程,进入就绪状态(CPU被剥夺)

  3. 就绪态的进程被分配到CPU,进入运行状态

  4. 阻塞态的进程出现有效输入,进入就绪态,等待操作系统分配CPU

此外,我们能直接控制的只有阻塞状态,减少阻塞,使进程尽可能的保持在就绪状态,提高效率

知识点二:开启进程的两种方式

开启进程:开启进程就是将父进程里面串行执行的程序放到子进程里,实现并发执行,这个过程中,会将父进程数据拷贝一份到子进程。
运行角度:是2个进程
注意:子进程内的初始数据与父进程的一样,如果子进程被创建或者被运行了,那么
   子进程里面数据更改对父进程无影响,2个进程是存在运行的

方式一:通过调用multiprocessing模块下面的Process类方法

from multiprocessing import Process
 
def func(name):
    print('%s is running...' % name)
    print('%s is ending...' % name)
 
 
if __name__ == '__main__':
    p = Process(target=func, args=('子进程',))  
	# 如果只有一个参数,args括号内一定要加逗号,确保以元组的形式传入
	# 这一步:只是在向操作系统发我要开启一个子进程的信号(具体开子进程的操作是由操作系统来完成的)
    p.start() 
	# 只是主进程给操作系统发送建立子进程的请求,并非立刻建立子进程
    print('主进程')

运行结果:主进程
		子进程 is running...
		子进程 is ending...

方式二:借助process类,自定义一个类(继承Process),从而创造一个对象

定义process类的子类,并重写该类的run()方法,run()方法的中写进程需要完成的任务。

from multiprocessing import Process

class MyProcess(Process):     # 继承Process类
    def run(self):  # run名字是固定的,不能更改
        print("%s is running" % self.name)  # 默认函数对象有name方法 ,结果为:Myprocess-1
        print('%s is done' % self.name)

if __name__ == '__main__':
    obj = MyProcess()
    obj.start()  # 本质上是在调用父类的start方法,而start方法下会触发run方法
    print('主进程')
运行结果:主进程
		MyProcess-1 is running
		MyProcess-1 is done

为什么开启进程要在main内执行?

由于在windows系统下,子进程是通过导入模块的方式拿到父进程的代码,如果没有main会一直开启子进程,

而子进程的申请是需要开辟内存以及申请pid等的。

问题4:python如何开启一个线程?

方式一:通过thread类直接创建

import threading

def foo(n):
    print('%s'%n)

def bar(n):
    print('%s'%n)

print('33')   # 主线程

t1 = threading.Thread(target=foo, args=(1,))    # 线程一
t2 = threading.Thread(target=bar, args=(2,))    # 线程二
t1.start()
t2.start()
# 创建线程,第一个参数是函数名字(不加括号,加括号就执行函数了)。
# 第二个参数是要传给函数的参数,以元组的形式。
# 创建线程之后, obj.start()启动线程。
执行结果:33
		1
		2		  

方式二:继承Thread类:

定义Thread类的子类,并重写该类的run()方法,run()方法的中写线程需要完成的任务。

import threading

# 定义MyThread类,其继承自threading.Thread这个父类
class MyThread(threading.Thread):
   def __init__(self):
     threading.Thread.__init__(self)
   def run(self):
     print("start t1")
     print("end t1")

t1=MyThread()  # 对类进行实例化
t1.start()   # 启动线程
print("主线程")
运行结果:start t1
		end t1
		主线程

补充:Thread类的一些常用方法

  • join(): 在子线程完成之前,主线程将一直被阻塞

  • setDaemon(True) 方法: 将进程声明为守护线程,必须在start()方法调用之前

问题5:线程之间如何通信?

方式一:threading.Event 事件

Python提供了非常简单的通信机制 Threading.Event,通用的条件变量(event.isSet==False/True)。多个线程可以等待某个事件的发生,在事件发生后,所有的线程都会被激活。

关于Event的使用,就四个函数:

event = threading.Event()

  • event.isSet() # 返回event的状态值。

  • event.wait() # 等待接收event的状态值,决定是否阻塞程序执行。如果event.isSet==False,将阻塞线程。

  • event.set() # 设置event的状态值为True,使所有设置该event事件的线程执行。

  • event.clear() # 重置event的状态值为False,使得所有该event事件都处于待命状态。

举个例子:

import time
import threading

class MyThread(threading.Thread):
    def __init__(self, name, event):
        super().__init__()
        self.name = name
        self.event = event

    def run(self):
        print('Thread: {} start at {}'.format(self.name, time.ctime(time.time())))
        # 等待event.set()后,才能往下执行
        self.event.wait()
        print('Thread: {} finish at {}'.format(self.name, time.ctime(time.time())))

threads = []
event = threading.Event()

# 定义三个线程,使用event事件
[threads.append(MyThread(str(i), event)) for i in range(1, 4)]

# 重置event,使得event.wait()起到阻塞作用
event.clear()

# 启动所有线程
[t.start() for t in threads]

print('等待5s...')
time.sleep(5)

print('唤醒所有线程...')
event.set()     
执行结果:Thread: 1 start at Fri Jul 12 15:05:50 2019
		Thread: 2 start at Fri Jul 12 15:05:50 2019
		Thread: 3 start at Fri Jul 12 15:05:50 2019
		等待5s...
		唤醒所有线程...
		Thread: 3 finish at Fri Jul 12 15:05:55 2019
		Thread: 2 finish at Fri Jul 12 15:05:55 2019
		Thread: 1 finish at Fri Jul 12 15:05:55 2019

可见在所有线程都启动 start() 后,并不会执行完,而是都在self.event.wait()阻塞了,需要通过event.set()来给所有线程发送执行指令才能往下执行。

方式二:threading.Condition条件

Condition和Event 是类似的,并没有多大区别。

Condition需要掌握几个函数:

cond = threading.Condition() # 创建一个cond条件 , 默认锁为 Rlock.

  • cond.acquire() # 类似lock.acquire()

  • cond.release() # 类似lock.release()

  • cond.wait() # 等待指定触发,同时会释放锁,直到被notify才重新占有琐。

  • cond.notify() # 发送指定,触发执行一个线程

  • cond.notifyAll() # 发送指定,触发执行所有线程

举个生产消费的例子:

import threading
import time
from random import randint

class Producer(threading.Thread):
    def run(self):
        global L
        while True:
            val=randint(0,100)
            print('生产者',self.name,":Append"+str(val), L)
            if lock_con.acquire():
                L.append(val)
                lock_con.notify()
                lock_con.release()
            time.sleep(3)
            
class Consumer(threading.Thread):
    def run(self):
        global L
        while True:
                lock_con.acquire()
                if len(L)==0:
                    lock_con.wait()
                print('消费者',self.name,":Delete"+str(L[0]),L)
                del L[0]
                lock_con.release()
                time.sleep(0.25)

if __name__=="__main__":

    L=[]
    lock_con=threading.Condition()
    threads=[]
    for i in range(5):
        threads.append(Producer())
    threads.append(Consumer())
    for t in threads:
        t.start()
    for t in threads:
        t.join()
执行结果:生产者 Thread-1 :Append48 []
		生产者 Thread-2 :Append9 [48]
		生产者 Thread-3 :Append73 [48, 9]
		生产者 Thread-4 :Append11 [48, 9, 73]
		生产者 Thread-5 :Append94 [48, 9, 73, 11]
		消费者 Thread-6 :Delete48 [48, 9, 73, 11, 94]
		消费者 Thread-6 :Delete9 [9, 73, 11, 94]
		消费者 Thread-6 :Delete73 [73, 11, 94]
		消费者 Thread-6 :Delete11 [11, 94]
		消费者 Thread-6 :Delete94 [94]

可见通过cond来通信,阻塞自己,并使对方执行。

方式三:queue.Queue队列

从一个线程向另一个线程发送数据最安全的方式可能就是使用 queue 库中的队列了。

创建一个被多个线程共享的 Queue 对象,这些线程通过使用put() 和 get() 操作来向队列中添加或者删除元素。

队列需要掌握的函数:

q = Queue(maxsize=0) # maxsize默认为0,不受限。

  • q.get() # 阻塞程序,等待队列消息。

  • q.get(timeout=5.0) # 获取消息,设置超时时间。

  • q.put() # 发送消息。

  • q.join() # 等待所有的消息都被消费完。

举一个老师点名的例子:

from threading import Thread
from queue import Queue
import time

class Student(Thread):
    def __init__(self, name, queue):
        super().__init__()
        self.name = name
        self.queue = queue

    def run(self):
        while True:
            # 阻塞程序,时刻监听老师,接收消息
            msg = self.queue.get()
            # 一旦发现点到自己名字,就赶紧答到
            if msg == self.name:
                print("{}:到!".format(self.name))

class Teacher:
    def __init__(self, queue):
        self.queue = queue

    def call(self, student_name):
        print("老师:{}来了没?".format(student_name))
        # 发送消息,要点谁的名
        self.queue.put(student_name)

queue = Queue()
teacher = Teacher(queue=queue)
s1 = Student(name="小明", queue=queue)
s2 = Student(name="小亮", queue=queue)
s1.start()
s2.start()

print('开始点名~')
teacher.call('小明')
time.sleep(1)
teacher.call('小亮')

总结:

学习了以上三种通信方法,我们很容易就能发现Event 和 Condition 是threading模块原生提供的模块,原理简单,功能单一,它能发送 True 和 False 的指令,所以只能适用于某些简单的场景中。

而Queue则是比较高级的模块,它可能发送任何类型的消息,包括字符串、字典等。其内部实现其实也引用了Condition模块(譬如put和get函数的阻塞),正是其对Condition进行了功能扩展,所以功能更加丰富,更能满足实际应用。

问题6:进程之间如何通信?

方式一:Queue队列,用于多个进程间实现通信

一个进程向 Queue 中放入数据,另一个进程从 Queue 中读取数据。

multiprocessing 模块下的 Queue 和 queue 模块下的 Queue 基本类似,它们都提供了 qsize()、empty()、full()、put()、put_nowait()、get()、get_nowait() 等方法。

区别只是 multiprocessing 模块下的 Queue 为进程提供服务,而 queue 模块下的 Queue 为线程提供服务。

from queue import Queue    #  为线程提供服务
from multiprocessing import Queue   # 为进程提供服务

举个例子:

import multiprocessing

def fun(que):
    print('(%s) 进程开始放入数据...' % multiprocessing.current_process().pid)
    que.put('Python')    # 向 Queue 中放入数据

if __name__ == '__main__':

    que = multiprocessing.Queue()    # 创建进程通信的Queue
    p = multiprocessing.Process(target=fun, args=(que,))  # 创建子进程
    p.start()  # 启动子进程
    print('(%s) 进程开始取出数据...' % multiprocessing.current_process().pid)   # 先走主进程
    print(que.get())  # 从 Queue 中读取数据
执行结果:(6364) 进程开始取出数据...
		(12716) 进程开始放入数据...
		Python

方式二:Pipe管道,用于两个进程的通信

使用 Pipe 实现进程通信,程序会调用 multiprocessing.Pipe() 函数来创建一个管道,该函数会返回两个 PipeConnection 对象,代表管道的两个连接端,用于连接通信的两个进程。

PipeConnection 对象包含如下常用方法:

  • send(obj):发送一个 obj 给管道的另一端,另一端使用 recv() 方法接收。
  • recv():接收另一端通过 send() 方法发送过来的数据。
  • fileno():关于连接所使用的文件描述器。
  • close():关闭连接。
  • poll([timeout]):返回连接中是否还有数据可以读取。
  • send_bytes(buffer[, offset[, size]]):发送字节数据。
  • recv_bytes([maxlength]):接收通过 send_bytes() 方法发迭的数据,maxlength 指定最多接收的字节数。
  • recv_bytes_into(buffer[, offset]):功能与 recv_bytes() 方法类似,只是该方法将接收到的数据放在 buffer 中。

举一个例子:

import multiprocessing

def f(conn):
    print('(%s) 进程开始发送数据...' % multiprocessing.current_process().pid)
    # 使用conn发送数据
    conn.send('Python')

if __name__ == '__main__':

    parent_conn, child_conn = multiprocessing.Pipe()    # 创建Pipe,该函数返回两个PipeConnection对象
    p = multiprocessing.Process(target=f, args=(child_conn, ))    # 创建子进程
    p.start()
    print('(%s) 进程开始接收数据...' % multiprocessing.current_process().pid)
    # 通过conn读取数据
    print(parent_conn.recv())  # Python
    p.join()

执行结果:(13796) 进程开始接收数据...
		(14792) 进程开始发送数据...
		Python
python进程、线程面试复习要点【超级干货】.png 关于python的进程线程基础以及理论,总结了很多篇文章所得出的精华。应对面试绰绰有余,希望能帮助大家更好的理解python的线程与进程。在面试者如鱼得水! 立即下载

相关推荐

用FPGA控制步进电机是种什么体验?从状态机到分频器,详解Verilog驱动A4988全流程

本文详细介绍了如何使用FPGA通过Verilog语言控制步进电机,从状态机设计到A4988驱动模块的精准控制全流程。FPGA的并行处理能力和纳秒级响应速度使其在步进电机控制中展现出显著优势,特别适合工业自动化和精密仪器应用。通过实战代码示例,展示了如何实现高效的状态机设计和可编程分频器,为开发者提供了一套完整的FPGA驱动步进电机解决方案。

weixin_30983965的博客 329

2026 python 求职 常见面试题(北京 爬虫/后端)

python 优缺点 开源,可移植,支持面向过程和面向对象,可扩展性,可嵌入性,库多 慢 用c重写重要部分,GIL python程序运行过程 pyCodeObject 内存 到 pyc 硬盘持久化存储 pyc有long 存的是写入时间 pyc 中 存的是 import导入的可重用的模块 分号在python中的应用 可写可不写,一行定义多个值时使用 python中的变量利用del删除对应的内存空间的数值 变量会改变内存空间,常量不会 断言 断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待

CXY00000的博客 7816

手把手教你用Cadence Virtuoso设计折叠式共源共栅放大器(0.18μm工艺实战)

本文详细介绍了在0.18μm工艺下使用Cadence Virtuoso设计折叠式共源共栅放大器的完整流程。从工艺参数获取、电路架构分析到具体参数计算和仿真验证,提供了实战设计指南,帮助工程师掌握这一模拟IC设计中的关键技术,特别适合需要中等增益和较大输出摆幅的应用场景。

open4的博客 405

python线程进程协程面试_线程,进程,协程面试知识点

2. threading.local的作用?importthreading#创建全局ThreadLocal对象:localVal =threading.local()localVal.val= "Main-Thread"defprocess_student():print( '%s (in %s)' %(localVal.val, threading.current_thread().name))...

weixin_39956182的博客 293

数理统计四大分布---正态分布、卡方分布、学生t分布和F分布

在统计学上,我们会遇到一些常见的分布,除了正态分布外,,如t检验对应的t分布,检验对应的分布,方差分析对应的F分布等。这些分布是统计学的基础,在假设检验、方差分析等领域都起着至关重要的作用。在此,我们对这四种分布做详细的介绍,并附上MATLAB代码。 四种分布的讲解摘自MATLAB 2016的统计学和机器学习工具箱,有兴趣的可以去查看英文原版。 另外,为了方便,上传文档为图片格式,可能有些模糊...

suncangan的博客 5万+

LinuxMint 22.1(Ubuntu24.04)下通过Wine完美运行同花顺远航版的实战指南

本文详细介绍了在LinuxMint 22.1(Ubuntu24.04)系统下通过Wine完美运行同花顺远航版的实战指南。从基础环境准备到深度优化,包括Wine环境配置、同花顺远航版安装、字体显示调优、任务栏兼容性修复等关键步骤,帮助Linux用户高效使用同花顺远航版进行股票交易和行情分析。

weixin_30919429的博客 570

常用的python面试题简单接触

2018年最常见的Python面试题&答案(上篇) 景略集智 已认证的官方帐号 299 人赞了该文章 Python新手在谋求一份Python编程工作前,必须熟知Python的基础知识。编程网站DataFlair的技术团队分享了一份2018年最常见Python面试题合集,既有基本的Python面试题...

aamoy06888的博客 2569

Android Google 支付接入

1. 从 2023 年 8 月 2 日起,所有新应用都必须使用结算库版本 5 或更高版本。自 2023 年 11 月 1 日起,现有应用的所有新版本都必须使用结算库版本 5 或更高版本。 2. 如果您的应用以 Android 14 或更高版本为目标平台,您必须更新到 PBL 5.2.1 或 PBL 6.0.1 或更高版本。

帅次的博客 9404

Python线程面试题

1.什么是GIL,怎么解决GIL? 在python的原始解释器CPython中存在着GIL(Global Interpreter Lock,全局解释器锁),因此在解释执行python代码时,会产生互斥锁来限制线程对共享资源的访问,直到解释器遇到I/O操作或者操作次数达到一定数目时才会释放GIL。所以,虽然CPython的线程库直接封装了系统的原生线程,但CPython整体作为一个进程,同一时间只...

西山枫叶 4052

【车载以太网】ATU(Address Translation Unit / Address Table Unit)

【车载以太网】ATU(Address Translation Unit / Address Table Unit)

天赐好车的博客 150

Claude Code、Codex、Gemini CLI、OpenCode 和 OpenClaw 配置管理太麻烦?试试这个统一管理工具

还在为 Claude Code、Codex、Gemini CLI 等 AI CLI 配置烦恼?🤯 这款桌面工具支持五大助手统一管理,一键切换 50+ 服务商,MCP 和 Skills 集中管理 🛠️,跨平台支持,让你的 AI 编程更高效 ⚡

XiaoqiangClub的博客 913

[优雅的面试] 进程 线程 协程分的清 | Python 主题月

前情提要:小庄的面试可谓是一波三折,面试官大佬邀请我面试多线程多进程这块,来看看小庄如何机智应对吧~正在上传…重新上传取消我:存储在硬盘中的代码是静态文件,运行中的程序被称为进程。进程之间数据是相互隔离的。一般说来,一个进程并不是自始至终连续不停地运行的,它与并发执行中的其他进程的执行相互制约。在一个进程的活动期间至少具备三种基本状态,即运行状态、就绪状态、阻塞状态。①当进程被创建完成并初始化后,会变成就绪状态。②处于就绪状态的进程被操作系统的进程调度器选中后,就分配给 CPU 正式运行该进程,进入运行状态

k15778864599的博客 323

RK3399驱动开发 | 19 - 阿美林7寸mipi屏幕调试(基于linux4.4.194内核)

NULL

Mculover666的博客(嵌入式) 2661

Python多线程、多进程与协程面试题解析

本篇博客将深入浅出地解析Python多线程、多进程与协程的概念、面试中常见的问题、易错点以及应对策略,并通过代码示例,助您在面试中从容应对相关挑战。深入理解与熟练运用Python多线程、多进程与协程,能够根据实际需求选择最适合的并发模型,提升程序性能与响应速度。面对相关面试问题,应深入理解这三种并发模型的概念、识别并避免常见易错点,通过编写高效、正确的并发代码展示扎实的技术功底。在面试中展现出对多线程、多进程与协程的深刻理解与良好实践,将极大提升您在面试官心中的技术形象。模块支持多进程编程。

zevjay的博客 2703

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

测试面试Python——线程进程协程代码实现(面试频率超高)

文章不仅是给大家看的,也是我秋招+社招迟到的复盘,大家加油吖~协程进程线程面试遇到的可能性还是很大的,我秋招和社招都有遇到过,希望大家多学习一下。!!作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

yjt2045263063的博客 373

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Python面试系列之--进程、线程、协程的原理和比较

持续更新中。。。 目录1. 进程、线程、协程的原理和比较1.进程:2.线程:3.协程: 1. 进程、线程、协程的原理和比较 简答: 1. 进程: 2. 线程: 3. 协程: 1.进程: 操作系统分配最小单元, 进程是一个实体。每个进程都有自己的地址空间(CPU分配)。实体空间包括三部分: * 文本区域:存储处理器执行的代码。 * 数据区域:存储变量或进程执行期间使用的动态分配的内存。 * 堆栈:进程执行时调用的指令和本地变量。 进程是一个"执行中的程序" 程序是指令与数据的有序结合, 程序本身是

a864636467的博客 698

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

python基础教程:多线程与多进程,开发岗面试自我介绍

Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。Python可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

m0_60607895的博客 971

python进程线程协程面试_面试-进程 线程 协程

进程的概念1.进程是一个实体。每个进程都有自己的地址空间(CPU分配)。实体空间包括三部分:* 文本区域:存储处理器执行的代码。* 数据区域:存储变量或进程执行期间使用的动态分配的内存。* 堆栈:进程执行时调用的指令和本地变量。2.进程是一个“执行中的程序”。程序是指令与数据的有序集合,程序本身是没有生命的,只有CPU赋予程序生命时(CPU执行程序),它才能成为一个活动的实体,称为“进程”。概括来...

weixin_39684898的博客 220

python线程进程协程面试_【面试高频问题】线程、进程、协程

需要先对 IO 的概念有一定的认识: IO在计算机中指Input/Output,也就是输入和输出。并发与并行并发:在操作系统中,某一时间段,几个程序在同一个CPU上运行,但在任意一个时间点上,只有一个程序在CPU上运行。当有多个线程时,如果系统只有一个CPU,那么CPU不可能真正同时进行多个线程,CPU的运行时间会被划分成若干个时间段,每个时间段分配给各个线程去执行,一个时间段里某个线程运行时,其...

weixin_39951018的博客 329

python进程线程协程面试_面试必备:进程,线程和协程

本文从操作系统原理出发结合代码实践讲解了以下内容:什么是进程,线程和协程?它们之间的关系是什么?为什么说Python中的多线程是伪多线程?不同的应用场景该如何选择技术方案?...什么是进程进程-操作系统提供的抽象概念,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。程序本身是没有生命周期的,它只是存在磁盘上的一些指令,程序一旦运行就是...

weixin_39962356的博客 372

python线程进程协程面试_一句话介绍python线程、进程和协程

一、进程:Python的os模块封装了常见的系统调用,其中就包括fork。而fork是linux常用的产生子进程的方法,简言之是一个调用,两个返回。在python中,以下的两个模块用于进程的使用。详细就不展开。multiprocessing:跨平台版本的多进程模块。Pool:进程池Queue、Pipes:进程通信二、线程:严格意义上,python的多线程属于伪多线程,因为受限于GIL,python...

weixin_39607935的博客 94
上一篇: python基本数据类型
下一篇: CSS总结
sumatch
博客等级 码龄8年 251粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值