一些草率不精确的观点:

并发: 一起发生,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有了新特性,比如:

  1. some_statements_that_cost_10ms
  2. __benice__
  3. some_statements_that_cost_15ms
  4. __benice__
  1. from asyncio import *
  2. from threading import *
  3. import time
  4.  
  5. _quit = 0
  6. def set_quit():
  7. print('Quitting...')
  8. global _quit
  9. _quit = 1
  10.  
  11. # We say that an object is an awaitable object if it can be used in an await expression.
  12. # Many asyncio APIs are designed to accept awaitables.
  13. async def task_fn(name):
  14. while not _quit:
  15. print(name)
  16. #time.sleep(30)
  17. await sleep(1)
  18. print(name, 'quits')
  19.  
  20. async def task_master(name_prefix):
  21. tasks = []
  22. for i in range(3):
  23. name = '%s.%c' % (name_prefix, chr(ord('A') + i))
  24. tasks.append(create_task(task_fn(name)))
  25. await wait(tasks)
  26.  
  27. class EvLoopThread(Thread):
  28. def run(self):
  29. loop = new_event_loop()
  30. loop.run_until_complete(task_master('Task'))
  31. del loop
  32.  
  33. def create_evloop_thread():
  34. th = EvLoopThread()
  35. th.start()
  36. return th
  37.  
  38. #print(type(sleep), dir(sleep))
  39. threads = []
  40. for i in range(2): threads.append(create_evloop_thread())
  41. try: input()
  42. except KeyboardInterrupt: print('^C is pressed')
  43. set_quit()
  44. for th in threads: th.join()
  45. 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. python3 调用 centos 常用系统命令

    一.创建目录 1 import os 2 3 base_path = '/data/sw_backup' 4 addr= 'FT' 5 ip='192.168.1.1' 6 path = base_p ...

  2. Typora简介

    Typora是什么 Typora是一款支持实时预览的Markdown文本编辑器,拥有macOS.Windows.Linux三个平台的版本,并且完全免费. 下载地址:https://www.typora ...

  3. 『学了就忘』Linux基础命令 — 28、别名和常用快捷键

    目录 1.别名 2.常用快捷键 1.别名 别名也是Shell中的命令. 命令的别名,就是命令的小名,主要是用于照顾管理员使用习惯的. 命令格式: # 查询系统中命令别名 [root@localhost ...

  4. 痞子衡嵌入式:聊聊i.MXRT1xxx上的普通GPIO与高速GPIO差异及其用法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT上的普通GPIO与高速GPIO差异. GPIO 可以说是 MCU 上最简单最常用的外设模块了,当一些原生功能外设接口模块不能 ...

  5. C++ 重载、重写、重定义的区别

    C++ 中 重载.重写.重定义的区别 重载(overload) 定义: 在同一个作用域内,两函数的函数名相同, 参数不相同(可以是参数类型不同或者是参数个数不同), 那么就说这两个 函数重载. 分类: ...

  6. c++学习笔记目录

    chapter name menu 一 从c到c++ 1.引用2.const关键词的用法3.动态内存分配4.内联函数5.函数重载6.函数的缺省参数7.结构化程序设计的不足8.面向对象的程序设计 二 类 ...

  7. 【linux系统】命令学习(七)进阶命令 curl jq

    curl 支持dict file ftp ftps gopher http https imap 1.实现代理 curl -x 129.3.3.3:8888 https://baidu.com 2.g ...

  8. ELK 7.4.2 单机安装配置

    Java环境准备 JDK下载 https://www.oracle.com/technetwork/java/javase/overview/index.html [root@manager ~]# ...

  9. 第十五章---JSON

    目录: (一)介绍 (二)Python 编码为 JSON 类型转换对应表 (三)JSON 解码为 Python 类型转换对应表 (四)实例 正文: (一)介绍 JSON (JavaScript Obj ...

  10. [atAGC045D]Lamps and Buttons

    由于$p_{i}$是随机的,不断选择最小的.未被操作过的$i$并处理其所在的环一定是最优的,而这样与已知$p_{i}$的区别是,当选择了一个$i=p_{i}$,那么必然失败(而已知$p_{i}$时不会 ...