Python 异步IO

前言

1. 什么是“多任务”的操作系统?

简单地说,就是操作系统可以同时运行多个任务。

2. 单核CPU是如何执行多任务的?

操作系统轮流让多个任务交替执行,任务1执行0.01s,切换到任务2,任务2执行0.01s,再切换到任务3,执行0.01s……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。

3. 如何通俗的解释进程和线程?

对于操作系统来说,一个任务就是一个“进程(Process)”,例如打开一个浏览器就是启动了浏览器进程,打开了Word就启动了一个Word进程。但是启动Word可能不止同时干一件事,例如:可以同时进行打字、排版、检查等,在一个进程内部,要同时干多件事,就需要同时执行多个“子任务”,我们把进程内的这些“子任务”就称为“线程(Thread)”。由于每个进程至少要干一件事,所以,一个进程至少有一个线程。真正地同时执行多线程需要多核CPU才可能实现。

4. 实现“多任务”的方式有哪些?

  • 多进程模式:启动多个进程,每个进程虽然只有一个线程,但多个进程可以一块执行多个任务。
  • 多线程模式:启动一个进程,在一个进程内启动多个线程,这样,多个线程也可以一块执行多个任务。
  • 多进程+多线程模式:启动多个进程,每个进程再启动多个线程,这样同时执行的任务就更多了,当然这种模型更复杂,实际很少采用。

多进程

1. multiprocessing是跨平台版本的多进程模块,multiprocessing模块提供了一个Process类来代表一个进程对象

from multiprocessing import Process
import os

def run_proc(name):
    """子进程执行的代码

    :param name:
    :return:
    """
    print('Run child process %s (%s)...' % (name, os.getpid()))

if __name__ == '__main__':
    print('Parent process %s.' % os.getpid())
    # 创建子进程时,只需要传入一个执行函数和函数的参数
    p = Process(target=run_proc, args=('test', ))
    print('Child process will start.')
    # 启动进程
    p.start()
    # 等待子进程结束后再继续往下运行,通常用于进程间的同步
    p.join()
    print('Child process end.')

------------------------------------
Parent process 17120.
Child process will start.
Run child process test (9316)...
Child process end.

原文地址:https://www.cnblogs.com/parzulpan/p/11981878.html

时间: 2024-10-05 05:04:57

Python 异步IO的相关文章

Python异步IO --- 轻松管理10k+并发连接

前言 异步操作在计算机软硬件体系中是一个普遍概念,根源在于参与协作的各实体处理速度上有明显差异.软件开发中遇到的多数情况是CPU与IO的速度不匹配,所以异步IO存在于各种编程框架中,客户端比如浏览器,服务端比如node.js.本文主要分析Python异步IO. Python 3.4标准库有一个新模块asyncio,用来支持异步IO,不过目前API状态是provisional,意味着不保证向后兼容性,甚至可能从标准库中移除(可能性极低).如果关注PEP和Python-Dev会发现该模块酝酿了很长时

Python异步IO

在IO操作的过程中,当前线程被挂起,而其他需要CPU执行的代码就无法被当前线程执行了. 我们可以使用多线程或者多进程来并发执行代码,为多个用户服务. 但是,一旦线程数量过多,CPU的时间就花在线程切换上了,真正运行代码的时间就少了,结果导致性能严重下降. 异步IO:当代码需要执行一个耗时的IO操作时,它只发出IO指令,并不等待IO结果,然后就去执行其他代码了.一段时间后,当IO返回结果时,再通知CPU进行处理. 对于大多数IO密集型的应用程序,使用异步IO将大大提升系统的多任务处理能力. 1.

Python异步IO之协程(一):从yield from到async的使用

引言:协程(coroutine)是Python中一直较为难理解的知识,但其在多任务协作中体现的效率又极为的突出.众所周知,Python中执行多任务还可以通过多进程或一个进程中的多线程来执行,但两者之中均存在一些缺点.因此,我们引出了协程. Tips 欲看完整代码请见:我的GitHub 为什么需要协程?首先,我们需要知道同步和异步是什么东东,不知道的看详解.简单来说:[同步]:就是发出一个“调用”时,在没有得到结果之前,该“调用”就不返回,“调用者”需要一直等待该“调用”结束,才能进行下一步工作.

Python 异步IO、IO多路复用

事件驱动模型 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 7 </head> 8 <body> 9 10 <p onclick="fun()">点我呀</p> 11 12 13 &l

python 异步IO\数据库\队列\缓存

协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈.因此: 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置. 协程的好处: 无需线程上下文切换的开销 无需原子操作锁定及同步的开销 方便切换控制流,简化编程模型

Python异步IO之协程(二):使用asyncio的不同方法实现协程

引言:在上一章中我们介绍了从yield from的来源到async的使用,并在最后以asyncio.wait()方法实现协程,下面我们通过不同控制结构来实现协程,让我们一起来看看他们的不同作用吧- 在多个协程中的线性控制流很容易通过内置的关键词await来管理.使用asyncio模块中的方法可以实现更多复杂的结构,它可以并发地完成多个协程. 一.asyncio.wait() 你可以将一个操作分成多个部分并分开执行,而wait(tasks)可以被用于中断任务集合(tasks)中的某个被事件循环轮询

转-python异步IO-asyncio

原文连接 http://blog.chinaunix.net/uid-190176-id-4223282.html 前言 异步操作在计算机软硬件体系中是一个普遍概念,根源在于参与协作的各实体处理速度上有明显差异.软件开发中遇到的多数情况是CPU与IO的速度不匹配,所以异步IO存在于各种编程框架中,客户端比如浏览器,服务端比如node.js.本文主要分析Python异步IO. Python 3.4标准库有一个新模块asyncio,用来支持异步IO,不过目前API状态是provisional,意味着

python之自定义异步IO客户端

#!/usr/bin/env python # -*- coding: utf8 -*- # __Author: "Skiler Hao" # date: 2017/5/16 15:04 import select import socket import pprint """ 自定义了异步IO模块 利用非阻塞的socket,不等待连接是否成功,不等待请求的相应 select模块,去监听创建的套接字,是否有准备写,准备读的 ""&quo

pythonasyncore异步IO由python标准库学习

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' import asynchat,asyncore,logging,socket #asyncore异步IO #作用:异常IO处理 #功能是处理IO对象,如套接字,从而能异步管理这些对象(而不是多个线程或者进程),包括类有dispatcher,这是一个套接字的包装器,提供了一些HOOK(钩子),从主循环函数loo()调用时可以处理连接以及读写事件 #服务器 #第一个类