一些草率不精确的观点:

并发: 一起发生,occurence: sth that happens。 并行: 同时处理. parallel lines: 平行线。thread.join()之前是啥?
落霞与孤鹜齐飞,秋水共长天一色。小霞与小鹜并发下单,线程1与线程2并行处理。并发是要被处理的,并行是处理并发的方法。要是不熟悉并行编程,它就成了要处理的"麻烦"。

一般地,每个线程有个函数,主线程有个main函数。无论线程在干啥,都可能被打断,其它线程得到执行的机会。线程调度器需要知道每个线程执行到哪里了,以便跳来跳去。与多个进程相比,多个线程共享全局变量或者说地址空间。Linux下fork创建进程,每个进程看起来也像函数,随后exec加载另一个可执行文件把它"冲掉"。没试过exec自己的a.out,应该可以。Windows下fork与exec合并成了CreateProcess,也许方便了,也许功能弱了。

与线程相比,协程长得也像函数,但不会被打断。sleep()说明不了协程的优越性,因为sleep并不是:
while (get_millisecond() <= time_out)
; // 占住CPU不干事
而是设个timer,通知调度器过段时间再执行自己。放弃控制权可能通过调用调度器里的函数来实现。异步I/O库里提供的read/recv/send/write等函数,都埋了放弃控制权的雷。

异步I/O是与阻塞式(blocking)I/O相对的,不是说异步I/O必用协程。协程倒是必用异步I/O。以读取HTTP Request为例,最简单的方式(Linux下)是:socket是fd (file descriptor), 从fd能拿到FILE*, fgets()就行。在没有从网上收到数据前,fgets()停在那里不动,我们不用在fgets()外包个for循环。很简单直接,但如何处理多路?异步I/O在event_loop()里留意多个socket上有无事件发生。若有则处理之,比如line += read_some_from_network(). 这是不舒服的,大多数人喜欢"我干这个我干那个"一路干到底,不喜欢"哎那谁这个你处理下"。

Client<->Proxy<->Server. Proxy特别适合用协程:逻辑清晰,I/O密集而不是CPU密集,切换丝滑而不顿挫。说不定fiber可以翻译成丝程。fibre并不比fiber格调高,前者英式拼写,后者AmE. colour... 先把美语说的有点样,再说端起来的事。

学python async的优先级不高。它的接口大改过,还会再大改吗?用python写个高性能的Web服务器? nginx...一堆。用python写个client,告诉小白用户得下载python,版本2和版本3也有要求?pyexe好像也不完美。基本上是同行在用,Ctrl-C退出大家相互理解的。

一个超超超简单的进程切换例子: https://www.cnblogs.com/funwithwords/p/15612922.html

下面的程序,一句time.sleep(30)就废了,还没上真正耗CPU的呢。当然epoll()也不能在处理event时占住CPU不放。也许我孤陋寡闻了,python有了新特性,比如:

some_statements_that_cost_10ms
__benice__
some_statements_that_cost_15ms
__benice__
from asyncio import *
from threading import *
import time _quit = 0
def set_quit():
print('Quitting...')
global _quit
_quit = 1 # We say that an object is an awaitable object if it can be used in an await expression.
# Many asyncio APIs are designed to accept awaitables.
async def task_fn(name):
while not _quit:
print(name)
#time.sleep(30)
await sleep(1)
print(name, 'quits') async def task_master(name_prefix):
tasks = []
for i in range(3):
name = '%s.%c' % (name_prefix, chr(ord('A') + i))
tasks.append(create_task(task_fn(name)))
await wait(tasks) class EvLoopThread(Thread):
def run(self):
loop = new_event_loop()
loop.run_until_complete(task_master('Task'))
del loop def create_evloop_thread():
th = EvLoopThread()
th.start()
return th #print(type(sleep), dir(sleep))
threads = []
for i in range(2): threads.append(create_evloop_thread())
try: input()
except KeyboardInterrupt: print('^C is pressed')
set_quit()
for th in threads: th.join()
print('Bye')

并发 并行 进程 线程 协程 异步I/O python async的更多相关文章

  1. Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程

    1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...

  2. 多道技术 进程 线程 协程 GIL锁 同步异步 高并发的解决方案 生产者消费者模型

    本文基本内容 多道技术 进程 线程 协程 并发 多线程 多进程 线程池 进程池 GIL锁 互斥锁 网络IO 同步 异步等 实现高并发的几种方式 协程:单线程实现并发 一 多道技术 产生背景 所有程序串 ...

  3. 进程&线程&协程

    进程  一.基本概念 进程是系统资源分配的最小单位, 程序隔离的边界系统由一个个进程(程序)组成.一般情况下,包括文本区域(text region).数据区域(data region)和堆栈(stac ...

  4. Python 进程线程协程 GIL 闭包 与高阶函数(五)

    Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 ​ 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...

  5. python自动化开发学习 进程, 线程, 协程

    python自动化开发学习 进程, 线程, 协程   前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...

  6. python并发编程之线程/协程

    python并发编程之线程/协程 part 4: 异步阻塞例子与生产者消费者模型 同步阻塞 调用函数必须等待结果\cpu没工作input sleep recv accept connect get 同 ...

  7. python的进程/线程/协程

    1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...

  8. 12_进程,线程,协程,IO多路复用的区别

    1.进程 1.进程可以使用计算机多核 2.进程是资源分配的单位 3.进程的创建要比线程消耗更多的资源效率很低 4.进程空间独立,数据安全性跟好操作有专门的进程间通信方式 5.一个进程可以包含多个线程, ...

  9. python-socket和进程线程协程(代码展示)

    socket # 一.socket # TCP服务端 import socket # 导入socket tcp_sk = socket.socket() # 实例化一个服务器对象 tcp_sk.bin ...

随机推荐

  1. jquery 实现 <imput>标签 密码框显示/隐藏密码功能

    1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 < ...

  2. Trap (陷入/中断) 源码解析

    用户空间和内核空间之间的切换通常称为trap trap的三种形式 系统调用引发 异常发生 设备中断 (时间中断.IO中断.网络中断等) supervise mode的权限 用户态和内核态之间的到底有什 ...

  3. js 实现匀速移动

    js 实现匀速移动 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  4. rz安装

    rpm -ivh http://www.rpmfind.net/linux/centos/6.10/os/x86_64/Packages/lrzsz-0.12.20-27.1.el6.x86_64.r ...

  5. 3组-Alpha冲刺-2/6

    一.基本情况 队名:发际线和我作队 组长博客:链接 小组人数:10 二.冲刺概况汇报 黄新成(组长) 过去两天完成了哪些任务 文字描述 在校内外进行了数据采集,采集了多场景的数据,并进行了帧分割. 展 ...

  6. 手把手教你基于Netty实现一个基础的RPC框架(通俗易懂)

    阅读这篇文章之前,建议先阅读和这篇文章关联的内容. [1]详细剖析分布式微服务架构下网络通信的底层实现原理(图解) [2][年薪60W的技巧]工作了5年,你真的理解Netty以及为什么要用吗?(深度干 ...

  7. [hdu7097]Just a Data Structure Problem

    (四边形不等式的套路题) 对于某一组$a_{i}$,显然可以区间dp,设$f_{l,r}$表示区间$[l,r]$​的答案,则转移即$$f_{l,r}=\begin{cases}0&(l=r)\ ...

  8. [cf1217F]Forced Online Queries Problem

    可以用并查集维护连通性,删除可以用按置合并并查集,但删掉一条边后无法再维护两点的联通性了(因为产生环的边是不加入的)暴力思路是, 考虑前i个操作后边的集合,暴力加入即可,但复杂度是$o(n^2)$的用 ...

  9. [luogu5294]序列

    也是一道保序回归的题,但思路不同于论文中模板题 考虑两个开口向上的二次函数$f(x)$和$g(x)$,求任意实数$x,y$满足$x\le y$且最小化$f(x)+g(y)$,这个最小值可以分类讨论求出 ...

  10. [loj3364]植物比较

    结论:设$b_{i}$满足该限制,则$a_{i}$合法当且仅当$\forall i\ne j,a_{i}\ne a_{j}$且$\forall |i-j|<k,[a_{i}<a_{j}]= ...