码迷,mamicode.com
首页 > 编程语言 > 详细

python并发之多进程、多线程、协程和异步

时间:2016-05-13 12:03:35      阅读:582      评论:0      收藏:0      [点我收藏+]

标签:

一、多线程

 

二、协程(又称微线程,纤程)

  协程,与线程的抢占式调度不同,它是协作式调度。协程在python中可以由generator来实现。

  首先要对生成器和yield有一个扎实的理解.

  调用一个普通的python函数,一般是从函数的第一行代码开始执行,结束于return语句、异常或者函数执行(也可以认为是隐式地返回了None)。

一旦函数将控制权交还给调用者,就意味着全部结束。而有时可以创建能产生一个序列的函数,来“保存自己的工作”,这就是生成器(使用了yield关键字的函数)。

  能够“产生一个序列”是因为函数并没有像通常意义那样返回。return隐含的意思是函数正将执行代码的控制权返回给函数被调用的地方。而"yield"的隐含意思是控制权的转移是临时和自愿的,我们的函数将来还会收回控制权。

 

详情请看:解释‘yield‘和‘Generators(生成器)‘

 

 

三、多进程

1、子进程(subprocess包)

  在python中,通过subprocess包,fork一个子进程,并运行外部程序。

  调用系统的命令的时候,最先考虑的os模块。用os.system()和os.popen()来进行操作。但是这两个命令过于简单,不能完成一些复杂的操作,如给运行的命令提供输入或者读取命令的输出,判断该命令的运行状态,管理多个命令的并行等等。这时subprocess中的Popen命令就能有效的完成我们需要的操作

>>>import subprocess
>>>command_line=raw_input()
ping -c 10 www.baidu.com
>>>args=shlex.split(command_line)
>>>p=subprocess.Popen(args)

  利用subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道(pipe):

import subprocess
child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
child2 = subprocess.Popen(["wc"], stdin=child1.stdout,stdout=subprocess.PIPE)
out = child2.communicate()
print(out)

communicate() 方法从stdout和stderr中读出数据,并输入到stdin中。

 

python并发之多进程、多线程、协程和异步

标签:

原文地址:http://www.cnblogs.com/tyomcat/p/5486827.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!