一些草率不精确的观点:

并发: 一起发生,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. Python中Numpy及Matplotlib使用

    Python中Numpy及Matplotlib使用 1. Jupyter Notebooks 作为小白,我现在使用的python编辑器是Jupyter Notebook,非常的好用,推荐!!! 你可以 ...

  2. 【转】PLI是什么以及怎么用

    programmable language interface 这里就说给verilog用的一些系统函数,还是无双大大的帖子 首先介绍了怎么让你自己写的pli系统函数在ncverilog里面可以成功调 ...

  3. redis 集群环境搭建

    原理: 1,每个Redis群集的节点都需要打开两个TCP连接,由于这两个连接就需要两个端口,分别是用于为客户端提供服务的常规Redis TCP命令端口(例如6379)以及通过将10000和命令端口相加 ...

  4. Mysql多实例搭建部署

    [部署背景] 公司测试环境需求多个数据库实例,但是只分配一台MySQL机器,所以进行多实例部署. [部署搭建] 创建软件包路径   mkdir /data/soft/package      /dat ...

  5. RedHat 7.0 下 FTP 服务的安装,启动,配置,以及虚拟用户的建立

    (注意! 区分shell命令和往配置文件里加的代码不同) 一:ftp服务的安装,启动和启用.   1:vim /etc/sysconfig/selinux     改为disabled后重启     ...

  6. Docker 部署前后端项目

    Docker 部署前后端项目 平生不会相思,才会相思,便害相思. 简介:都是被逼的,从零开始一个Docker 部署九个微服务和三个前端项目.其中,这些服务需要用到Nacos.MySQL.Nginx.E ...

  7. 【Python+postman接口自动化测试】(7)Postman 的使用教程

    Postman v6的使用 Postman: 简单方便的接口调试工具,便于分享和协作.具有接口调试,接口集管理,环境配置,参数化,断言,批量执行,录制接口,Mock Server, 接口文档,接口监控 ...

  8. [python]selenium常用的操作

    浏览器 1.火狐浏览器 br = webdriver.Firefox() #最大化窗口br.maximize_window() br.get('http://baidu.com') 2.谷歌浏览器 b ...

  9. ES访问遇到sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

    cmd命令cd到jre/bin目录下 输入命令keytool -import -alias 别名 -keystore cacerts -file ‪C://certs//elasticsearch// ...

  10. python unicode escape

    from: https://stackoverflow.com/questions/44742806/how-to-remove-escape-characters-escaping-unicode- ...