随笔分类 -  并发编程

摘要:协程 协程:是单线程下的并发,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的 需要强调的是: 1. python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其他线程运行) 2. 单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切... 阅读全文
posted @ 2018-07-04 14:59 游走在边缘的人 阅读(282) 评论(0) 推荐(0) 编辑
摘要:IO模型 IO主要分为:阻塞IO,非阻塞IO,多路复用IO,异步IO IO模型一般会经历两个阶段: 1)等待数据准备 (Waiting for the data to be ready) 2)将数据从内核拷贝到进程中(Copying the data from the kernel to the process) 阻塞IO(blocking IO) 在linux中,默认情况下所有的soc... 阅读全文
posted @ 2018-07-04 14:58 游走在边缘的人 阅读(145) 评论(0) 推荐(0) 编辑
摘要:开启进程的两种方法 使用multiprocessing模块, multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,>提供了Process、Queue、Pipe、Lock等组件。 Process的类: 创建进... 阅读全文
posted @ 2018-07-04 14:58 游走在边缘的人 阅读(330) 评论(0) 推荐(0) 编辑
摘要:join方法 在主进程运行过程中如果想并发地执行其他的任务,我们可以开启子进程,此时主进程的任务与子进程的任务分两种情况 情况一:在主进程的任务与子进程的任务彼此独立的情况下,主进程的任务先执行完毕后,主进程还需要等待子进程执行完毕,然后统一回收资源。 情况二:如果主进程的任务在执行到某一个阶段时,需要等待子进程执行完毕后才能继续执行,就需要有一种机制能够让主进程检测子进程是否运行完毕,在子... 阅读全文
posted @ 2018-07-04 14:58 游走在边缘的人 阅读(262) 评论(0) 推荐(0) 编辑
摘要:进程池与线程池 属性介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ProcessPoolExecutor: 进程池,提供异步调用 基本方法 1、submit(fn, *args, **kwargs) 异步提交任务 2、map(func, *iterables, timeout=None, chunk... 阅读全文
posted @ 2018-07-04 14:57 游走在边缘的人 阅读(241) 评论(0) 推荐(0) 编辑
摘要:守护进程 关于守护进程: 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children #!/usr/bin/env python3 # -*- coding:utf-8 -*- from multiprocessing ... 阅读全文
posted @ 2018-07-04 14:57 游走在边缘的人 阅读(145) 评论(0) 推荐(0) 编辑
摘要:GIL介绍 GIL本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全 如果多个线程的target=work,那么执行流程是: 多个线程先访问到解释器的代码,即拿到执行权限,然后将target的代码交给解释器的代码去执行 解释器的代码是所有线程共享的,所以垃圾回收线程也可能访问到解释器的代码而去... 阅读全文
posted @ 2018-07-04 14:56 游走在边缘的人 阅读(152) 评论(0) 推荐(0) 编辑
摘要:死锁 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下: #!/usr/bin/env python3 # -*- coding:utf-8 -*- from threading import Thread,Lock import ... 阅读全文
posted @ 2018-07-04 14:56 游走在边缘的人 阅读(738) 评论(0) 推荐(0) 编辑
摘要:信号量 信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行,信号量同一时间可以有5个任务拿到锁去执行,如果说互斥锁是合租房屋的人去抢一个厕所,那么信号量就相当于一群路人争抢公共厕所,公共厕所有多个坑位,这意味着同一时间可以有多个人上公共厕所,但公共厕所容纳的人数是一定的,这便是信号量的大小 from threading import Thread,Semaph... 阅读全文
posted @ 2018-07-04 14:56 游走在边缘的人 阅读(196) 评论(0) 推荐(0) 编辑
摘要:线程queue queue的三种用法: 先进先出->队列 import queue q=queue.Queue(3) q.put('first') q.put('second') q.put('third') print(q.get()) print(q.get()) print(q.get()) ''' 结果(先进先出): first second third ''' 后进先出-... 阅读全文
posted @ 2018-07-04 14:56 游走在边缘的人 阅读(90) 评论(0) 推荐(0) 编辑
摘要:多线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于cpu),而一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责把资源整合到一起,是一个资源单位,而一个车间内至少有一条流水线。 所以,进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行... 阅读全文
posted @ 2018-07-04 14:55 游走在边缘的人 阅读(111) 评论(0) 推荐(0) 编辑
摘要:守护线程 无论是进程还是线程,都遵循:守护xx会等待xx运行完毕后被销毁 运行完毕并非终止运行: 1、对主进程来说,运行完毕指的是主进程代码运行完毕 2、对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕 详细解释: 1、主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源... 阅读全文
posted @ 2018-07-04 14:55 游走在边缘的人 阅读(93) 评论(0) 推荐(0) 编辑
摘要:作业题目: 开发一个支持多用户在线的FTP程序 作业需求: 要求 1.用户加密认证(已实现) 2.允许同时多用户登录 3.每个用户有自己的家目录 ,且只能访问自己的家目录(已实现) 4.对用户进行磁盘配额,每个用户的可用空间不同 5.允许用户在ftp server上随意切换目录(已实现) 6.允许用 阅读全文
posted @ 2018-06-15 10:53 游走在边缘的人 阅读(1120) 评论(0) 推荐(0) 编辑