python进程、线程、协程、IO多路复用

线程进程介绍  

  1. 工作最小单元是线程
  2. 应用程序 -> 至少有一个进程 -> 至少有一个线程
  3. 应用场景:

      IO密集型:线程

      计算密集型:进程

  4. GIL,全局解释器锁。

      保证同一个进程中只有一个线程同时被调度

线程

  1. 基本使用

def task(arg):
    time.sleep(arg)
    print(arg)

for i in range(5):
    t = threading.Thread(target=task,args=[i,])
    # t.setDaemon(True) # 主线程终止,不等待子线程
    # t.setDaemon(False)
    t.start()
    # t.join() # 一直等
    # t.join(1) # 等待最大时间

  2. 锁

import threading
import time
v = 10
# 1. 只能有一个人使用锁
lock = threading.Lock() # 只能开一把
lock = threading.RLock()# 可以开多把

def task(arg):
    time.sleep(2)
    # 申请使用锁,其他人等
    lock.acquire()
    lock.acquire()
    global v
    v -= 1
    print(v)
    # 释放
    lock.release()
    lock.release()

for i in range(10):
    t = threading.Thread(target=task,args=(i,))
    t.start()

  1. 只能有一个人使用锁
    # lock = threading.Lock() # 只能开一把
    # lock = threading.RLock()# 可以开多把
  2. 多个人同时使用锁
    # lock = threading.BoundedSemaphore(3)
  3. 所有的解脱锁的限制
    #lock = threading.Event()
  4. 肆意妄为
    #lock = threading.Condition()

线程池

  在什么情况下使用线程池?

    1.单个任务处理的时间比较短

    2.将需处理的任务的数量大

  使用线程池的好处:

    1.减少在创建和销毁线程上所花的时间以及系统资源的开销

    2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。

  模式一:直接处理

def task(url):
    """
    任务执行两个操作:下载;保存本地
    """
    # response中封装了Http请求响应的所有数据
    # - response.url            请求的URL
    # - response.status_code    响应状态码
    # - response.text           响应内容(字符串格式)
    # - response.content        响应内容(字节格式)
    # 下载
    response = requests.get(url)

    # 下载内容保存至本地
    f = open(‘a.log‘,‘wb‘)
    f.write(response.content)
    f.close()

pool = ThreadPoolExecutor(2)
url_list = [
    ‘http://www.oldboyedu.com‘,
    ‘http://www.autohome.com.cn‘,
    ‘http://www.baidu.com‘,
]
for url in url_list:
    print(‘开始请求‘,url)
    # 去连接池中获取链接
    pool.submit(task,url)

  模式二:分步处理

def save(future):
    """
    只做保存  # future中包含response
    """
    response = future.result()

    # 下载内容保存至本地
    f = open(‘a.log‘,‘wb‘)
    f.write(response.content)
    f.close()

def task(url):
    """
    只做下载 requests
    """
    # response中封装了Http请求响应的所有数据
    # - response.url            请求的URL
    # - response.status_code    响应状态码
    # - response.text           响应内容(字符串格式)
    # - response.content        响应内容(字节格式)
    # 下载
    response = requests.get(url)
    return response

pool = ThreadPoolExecutor(2)
url_list = [
    ‘http://www.oldboyedu.com‘,
    ‘http://www.autohome.com.cn‘,
    ‘http://www.baidu.com‘,
]
for url in url_list:
    print(‘开始请求‘,url)
    # 去连接池中获取链接
    # future中包含response
    future = pool.submit(task,url)
    # 下载成功后,自动调用save方法
    future.add_done_callback(save)

进程   

  1. 基本使用

from multiprocessing import Process
import time
def task(arg):
    time.sleep(arg)
    print(arg)

if __name__ == ‘__main__‘:
    for i in range(10):
    p = Process(target=task,args=(i,))
    p.daemon = True
    # p.daemon = False
    p.start()
    # p.join(1)

print(‘主进程最后...‘)

  2. 进程之间的数据共享
      特殊的东西
    - Array(‘类型’,长度)
    - Manager().list() / Manager().dict()

  3. 进程池

    跟线程池一样

协程

  线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员。

  协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。

  协程的适用场景:当程序中存在大量不需要CPU的操作时(IO),适用于协程;

# 协程
# from greenlet import greenlet
#
# def test1():
#     print(12)
#     gr2.switch()
#     print(34)
#     gr2.switch()
#
# def test2():
#     print(56)
#     gr1.switch()
#     print(78)
#
# gr1 = greenlet(test1)
# gr2 = greenlet(test2)
# gr1.switch()

# 根据协程二次开发:协程+IO
from gevent import monkey; monkey.patch_all()
import gevent
import requests

def f(url):
    response = requests.get(url)
    print(response.url,response.status_code)

gevent.joinall([
        gevent.spawn(f, ‘http://www.oldboyedu.com/‘),
        gevent.spawn(f, ‘http://www.baidu.com/‘),
        gevent.spawn(f, ‘http://github.com/‘),
])

IO多路复用

时间: 2024-10-08 15:19:42

python进程、线程、协程、IO多路复用的相关文章

# 进程/线程/协程 # IO:同步/异步/阻塞/非阻塞 # greenlet gevent # 事件驱动与异步IO # Select\Poll\Epoll异步IO 以及selectors模块 # Python队列/RabbitMQ队列

1 # 进程/线程/协程 2 # IO:同步/异步/阻塞/非阻塞 3 # greenlet gevent 4 # 事件驱动与异步IO 5 # Select\Poll\Epoll异步IO 以及selectors模块 6 # Python队列/RabbitMQ队列 7 8 ############################################################################################## 9 1.什么是进程?进程和程序之间有什么

python 进程 线程 协程

并发与并行:并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔内发生.在单核CPU下的多线程其实都只是并发,不是并行. 进程是系统资源分配的最小单位,进程的出现是为了更好的利用CPU资源使到并发成为可能.进程由操作系统调度. 线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能.线程共享进程的大部分资源,并参与CPU的调度, 当然线程自己也是拥有自己的资源的,例如,栈,寄存器等等.线程由操作系统调度. 协程通

python 进程/线程/协程 测试

# Author: yeshengbao # -- coding: utf-8 -- # @Time : 2018/5/24 21:38 # 进程:如一个人拥有分身(分数数最好为cpu核心数)几乎同时进行做工# 线程:如这个人正在烧开水,但同时又可以在烧水时间内去吃饭,和扫地,这时线程就会对其随机选择,可能还会出现地还没扫完,水就开了,但他还会扫地{这就可能出现数据丢失}..# 协程:这个一个比线程更小的线程非常相似,但他在执行任务时,已经被规划好了,不会就行额外的时间浪费,创建时更省资源 im

python进程|线程|协程

进程(Process) 1)进程就是正在运行的程序,它是操作系统中,资源分配的最小单位 (1)资源分配:分配的是cpu和内存等物理资源 (2)进程号是进程的唯一标识 2)同一个程序执行两次之后是两个进程 3)进程和进程之间的关系: 数据彼此隔离,通过socket通信 获取进程id import os res = os.getpid() # 获取当前进行id (当前子进程) print(res) res = os.getppid() # 获取父进程id print(res) # result "&

协程/IO多路复用

一.协程: 概念:是一个比线程更加轻量级的单位,是组成线程的各个函数 为什么要有协程: 想要在单线程内实现并发的效果.但因为Cpython有GIL锁,限制了在同一时间点,CPU只能执行一个线程,所以想要在执行一个线程的期间,充分利用cpu的性能,所以才有了想在单线程内实现并发的效果 cpu 为什么要切换: 1.因为某个程序阻塞 2.因为某个程序用完了时间片 很明显,解决1 这个问题才能提高效率 所以想要实现单线程的并发,就要解决在单线程中,多个任务函数中,某个任务函数遇见IO操作,马上自动切换到

初识进程 线程 协程(三):协程

协程:(又称微线程,也是交替运行) 进程-->线程-->协程 协程就是充分利用cpu给该线程的时间,多个协程只使用一个线程,某个任务遇到阻塞,执行下一个任务.如果一个线程只执行一个任务,比较容易进入阻塞队列,如果这条线程永远在工作(协程:一个线程执行多个任务),永远不会进入阻塞队列. 适用场景:    当程序中存在大量不需要CPU的操作时(IO) 特点: 每次都能从上次暂停的位置继续执行 三种实现方式: 1.yield(生成器) 生成器:一边计算一边循环的机制 def a(): ......

python的进程/线程/协程

1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有一个线程被执行. 多线程的特点: 线程比进程更轻量级,创建一个线程要比创建一个进程快10-100倍. 线程共享全局变量. 由于GIL的原因,当一个线程遇到IO操作时,会切换到另一个线程,所以线程适合IO密集型操作. 在多核cpu系统中,最大限度的利用多核,可以开启多个线程,开销比进程小的多,但是这并

进程/线程/协程/GIL

线程 线程是操作系统调度的最小单位 threading模块 线程的调用方式: import threading import time '''直接调用''' def hello(name): print("Hello %s"%name) time.sleep(3) if __name__ == "__main__": t1=threading.Thread(target=hello,args=("zhangsan",)) #生成线程实例 t2=t

Python并发编程-进程 线程 协程

一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据集:数据集则是程序在执行过程中所需要使用的资源 3.进程控制块:进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感 知进程存在的唯一标志. 二.线程                                                                        

进程线程协程那些事儿

一.进程与线程 1.进程 我们电脑的应用程序,都是进程,假设我们用的电脑是单核的,cpu同时只能执行一个进程.当程序出于I/O阻塞的时候,CPU如果和程序一起等待,那就太浪费了,cpu会去执行其他的程序,此时就涉及到切换,切换前要保存上一个程序运行的状态,才能恢复,所以就需要有个东西来记录这个东西,就可以引出进程的概念了. 进程就是一个程序在一个数据集上的一次动态执行过程.进程由程序,数据集,进程控制块三部分组成.程序用来描述进程哪些功能以及如何完成:数据集是程序执行过程中所使用的资源:进程控制