一些草率不精确的观点:

并发: 一起发生,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. 字典树(Trie)

    终于学会字典树了,真开心(然后就滚过来写总结了). 首先,字典树到底是个什么东西呢?请看下面这段话: 字典树,常被用来保存与查找大量的字符串,它利用了字符串之间的公共前缀来节约时间,但它的空间花费较大 ...

  2. hdu 5057 Argestes and Sequence (数状数组+离线处理)

    题意: 给N个数.a[1]....a[N]. M种操作: S X Y:令a[X]=Y Q L R D P:查询a[L]...a[R]中满足第D位上数字为P的数的个数 数据范围: 1<=T< ...

  3. Docker 18.03 Centos7.6 安装 内网

    首先访问https://download.docker.com/linux/centos/7/x86_64/stable/Packages/获取对应版本的rpm包docker包docker-ce-18 ...

  4. 【linux命令】 磁盘管理

    du du是查看硬盘的使用情况,统计文件或目录的空间大小. -a 显示所有目录或文件的大小 -b 以byte为单位,显示目录或文件的大小 -c 显示目录或文件的总和 -k 以KB为单位输出 -m 以M ...

  5. vscode + vim 全键盘操作高效搭配方案

    基础知识 vscode-vim vscode-vim是一款vim模拟器,它将vim的大部分功能都集成在了vscode中,你可以将它理解为一个嵌套在vscode中的vim. 由于该vim是被模拟的的非真 ...

  6. Pytorch中stack()方法的理解

    Torch.stack() 1. 概念 在一个新的维度上连接一个张量序列 2. 参数 tensors (sequence)需要连接的张量序列 dim (int)在第dim个维度上连接 注意输入的张量s ...

  7. 从环境搭建到回归神经网络案例,带你掌握Keras

    摘要:Keras作为神经网络的高级包,能够快速搭建神经网络,它的兼容性非常广,兼容了TensorFlow和Theano. 本文分享自华为云社区<[Python人工智能] 十六.Keras环境搭建 ...

  8. 利用opencv进行简易的拍照并处理照片

    今天用python写了一个调用摄像头拍照并对图片进行素描化或动漫化的小demo. 首先我的环境是:PyCharm+python3.8+opencv-python(4.4.0.42) 我们分析一下思路, ...

  9. hexo+腾讯云

    hexo+腾讯云主机搭建博客 参考链接1 参考链接2 参考链接3 说明:不建议用hexo在云主机上搭建博客,感觉多此一举,建议hexo+github, wordpress+云主机(宝塔界面更快哦) 一 ...

  10. 关于【【故障公告】数据库服务器 CPU 近 100% 引发的故障(源于 .NET Core 3.0 的一个 bug)】IS NOT NULL测试

    测试如图,Core_Users的PhoneNumber可为空,存在索引,记录数1500000+ 增加is not null,查询计划消耗增加了一个0%的筛选器消耗,IO消耗如下一模一样 如果是IS N ...