进程,线程,协程以及python多线程与协程的实现

参考链接 https://segmentfault.com/p/1210000016570498/read
https://juejin.im/post/6844904057321029645

进程是cpu进行资源分配的单位,可以理解为”正在运行的程序“。一个cpu同一时间只能执行一个进程,多进程的实现原则是cpu飞快切换不同进程,看着像是多个进程同时进行。

线程属于进程,是cpu的执行单位。线程共享进程的内存地址空间。多线程是不安全的,当其中一个线程崩溃了,会导致整个进程的崩溃,但是进程之间相互不会影响。

协程是属于线程的,协程程序是在线程里跑的,因此又称为微线程。线程的切换是由cpu自动调度的,而协程的切换是用户通过代码手动切换,因此协程切换没有线程的上下文切换消耗,切换效率较高。同时,由于切换是用户手动操作,也不会出现代码执行一半被强制打断的情况,因此不需要原子锁(多个线程进行一个操作时,其中任意一个线程或者没有开始进行这个操作,或者完全执行了这个操作,不会出现执行一半被其他线程打断的情况)。


并发,指的是程序运行在一个cpu上,cpu通过上下文切换,实现程序的看似同时执行。并行指的是两个程序同时运行在两个cpu上,相互之间没有任何影响。
正常情况下,一个线程可以运行在一个cpu上,多线程可以运行在多核cpu,是并行操作。但是由于python GIL全局解释锁的存在,python的多线程其实是运行在一个cpu上的,是并发的。协程是运行在一个线程中的,因此是在一个cpu上的并发操作。多线程和协程好像都是一个cpu上的并发操作,那么,什么时候使用多线程,什么时候使用协程呢?
https://blog.csdn.net/mydistance/article/details/82989336?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduend~default-1-82989336.nonecase
一般来说,解决并行事件的传统思路可能是使用多线程。但是多线程有几个劣势,第一是资源的开销,第二是由于Python GIL(全局解释锁)的存在,多线程并非并行执行,而是交替执行,造成多线程在计算密集型任务的效率并不高。对开发者而言,多线程实现方式更加简单,但是在大多数情况下,协程的效率其实更高。
要是每个任务都是纯计算的,其实并发并不能提高其整体效率,多线程还会因为需要切换而降低效率。并发提升效率的原理是在任务一遇到io情况下,切到任务二去执行,这样就可以利用任务一阻塞的时间完成任务二的计算,效率的提升就在于此。https://www.cnblogs.com/russellyoung/p/python-zhi-xie-cheng.html


python 多线程实现
python有两个模块用于实现多线程,thread和threading模块,thread模块提供了基本的线程和锁支持,threading提供的是更高级的完全的线程管理。因此一般情况下,使用的是threading来实现python的多线程机制。
注意,线程可以设置为守护线程,守护线程是在进程所有其余线程结束后自动结束,没办法设置其针对某个线程进行守护。
实现可以获取线程返回值的多线程方法,自己重写thread类继承threading.Thread,对其中函数进行自定义实现。参考链接 https://www.cnblogs.com/tianleblog/p/11599079.html

import threading
class MyThread(threading.Thread):
   def __init__(self,func,args=()):
       super(MyThread,self).__init__()
       self.func = func
       self.args = args
   def run(self):
       self.result = self.func(*self.args)
   def get_result(self):
       try:
          return self.result  # 如果子线程不使用join方法,此处可能会报没有>self.result的错误
       except Exception:
           return None
def foo(a,b,c):
   time.sleep(1)
   return a*2,b*2,c*2
st = time.time()
li = []
for i in xrange(4):
  t = MyThread(foo,args=(i,i+1,i+2))
 li.append(t)
   t.start()
for t in li:
   t.join()  # 一定要join,不然主线程比子线程跑的快,会拿不到结果
   print t.get_result()

python 协程实现
https://blog.csdn.net/u011570492/article/details/90109983
python可以通过 yield/send 的方式实现协程。在python 3.5以后,async/await 成为了更好的替代方案。
python2协程实现方案
https://www.cnblogs.com/renpingsheng/p/7218967.html
python3
中协程实现方法
https://blog.csdn.net/dg_lee/article/details/103966162

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352