windows下多进程加协程并发模式
好久没更新博客了。正好最近要整理一下最近这段时间做过的项目以及学习python的一些心得。如标题所示,今天就来说说windows下多进程加协程并发模式。其实网上还是蛮多在linux下的多进程加协程并发模式,本身linux对python的支持更好吧。但是由于本人的开发环境是windows的,而且网上关于这方面的资料还是少了一点,不过经过一番折腾,也算是弄出来了。废话不多说,先贴代码吧:

# coding=utf-8
# windows下多进程加协程并发模式
# 打入gevent的monkey补丁
from gevent import monkey
monkey.patch_all()
# 导入协程池
from gevent.pool import Pool
import urllib2
# 导入多进程模块
import multiprocessing
import time
# 定义一个爬取微博网页的方法
def html(url=u'http://weibo.com/'):
# 用上多进程的锁机制,用于防止连续打印
lock = multiprocessing.Lock()
try:
h = urllib2.urlopen(url).read()
except:
lock.acquire()
print u'连接错误'
lock.release()
else:
lock.acquire()
print u'done'
lock.release() # 定义一个协程并发方法(用的是gevent的协程池)
def a(num):
pool = Pool(100)
# 协程池的map方法可以让你自定义并发次数,这里可以自定义爬取微博网页的并发次数,第一个参数是要执行的函数
# 第二个参数可以理解成需要并发参数的次数
pool.map(html, [u'http://weibo.com/' for i in xrange(num)])
pool.kill()
pool.join() # 这个是比较关键的一个方法,就是协程加多进程的并发模式
def b(num):
t = []
# 建立10个进程来并行协程即方法a
for i in xrange(10):
p = multiprocessing.Process(target=a, args=(num,))
p.start()
t.append(p)
for each in t:
each.join() # 对比多进程加协程与纯粹协程的各自的并发状态
if __name__ == '__main__':
print u'方法b开始计时:'
start = time.time()
b(10)
print u'方法b总共花费%f秒' % (time.time() - start)
print u'方法a开始计时:'
start = time.time()
a(100)
print u'方法a总共花费%f秒' % (time.time() - start)

上面的代码注释的挺清楚的了,下面贴一下执行的结果吧:
从上面的结果可以看到,执行协程加多进程的方法b时,多核cpu是可以被充分利用的,这是单纯使用协程方式无法做到的,这也是多进程的一大好处吧。由于我这里实验的是100次并发,所以其实就效果来说还不是很明显,但是当你要瞬时并发一千个或者一万个的时候,差距就可以显现出来了,显然,协程加多进程的方式是更加牛叉的,这种模式充分把两者的优点结合起来了。
这里如果读者对python的协程模块与多进程模块不熟悉的话,还是自行百度一下吧。毕竟自己真正理解了才是自己的东西啊。其实我也还是个python菜鸟,如果上面的代码有啥问题或者更好的建议的话,还希望大神们不吝赐教呀!
windows下多进程加协程并发模式的更多相关文章
- Python多线程、多进程和协程的实例讲解
线程.进程和协程是什么 线程.进程和协程的详细概念解释和原理剖析不是本文的重点,本文重点讲述在Python中怎样实际使用这三种东西 参考: 进程.线程.协程之概念理解 进程(Process)是计算机中 ...
- web服务-2、四种方法实现并发服务器-多线程,多进程,协程,(单进程-单线程-非堵塞)
知识点:1.使用多线程,多进程,协程完成web并发服务器 2.单进程-单线程-非堵塞也可以实现并发服务器 1.多进程和协程的代码在下面注释掉的部分,我把三种写在一起了 import socket im ...
- Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)
Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...
- 二、深入asyncio协程(任务对象,协程调用原理,协程并发)
由于才开始写博客,之前都是写笔记自己看,所以可能会存在表述不清,过于啰嗦等各种各样的问题,有什么疑问或者批评欢迎在评论区留言. 如果你初次接触协程,请先阅读上一篇文章初识asyncio协程对asy ...
- python异步加协程获取比特币市场信息
目标 选取几个比特币交易量大的几个交易平台,查看对应的API,获取该市场下货币对的ticker和depth信息.我们从网站上选取4个交易平台:bitfinex.okex.binance.gdax.对应 ...
- 进击的Python【第十章】:Python的socket高级应用(多进程,协程与异步)
Python的socket高级应用(多进程,协程与异步)
- python3通过gevent.pool限制协程并发数量
协程虽然是轻量级的线程,但到达一定数量后,仍然会造成服务器崩溃出错.最好的方法通过限制协程并发数量来解决此类问题. server代码: #!/usr/bin/env python # -*- codi ...
- 多线程、多进程、协程、IO多路复用请求百度
最近学习了多线程.多进程.协程以及IO多路复用,那么对于爬取数据来说,这几个方式哪个最快呢,今天就来稍微测试一下 普通方式请求百度5次 import socket import time import ...
- Go语言协程并发---管道信号量应用
package main import ( "fmt" "math" "strconv" "time" ) /* ·10 ...
随机推荐
- JSP自己定义标签继承哪个类
JSP自己定义标签继承哪个类 解:JSP自己定义标签继承TagSupport
- Golang Map Addressability
http://wangzhezhe.github.io/blog/2016/01/22/golangmapaddressability-dot-md/ 在golang中关于map可达性的问题(addr ...
- js 宽和高
网页可见区域宽: document.body.clientWidth; 网页可见区域高: document.body.clientHeight; 网页可见区域宽: document.body.offs ...
- 怎样创建.NET Web Service http://blog.csdn.net/xiaoxiaohai123/article/details/1546941
为什么需要Web Service 在通过internet网购买商品后,你可能对配送方式感到迷惑不解.经常的情况是因配送问题找配送公司而消耗你的大量时间,对于配送公司而言这也不是一项增值服务. 为了解决 ...
- 用python模拟TCP3次握手连接及发送数据
源码如下: from scapy.all import * import logging logging.getLogger('scapy.runtime').setLevel(logging.ERR ...
- AQS实现公平锁和非公平锁
https://www.cnblogs.com/chengdabelief/p/7493200.html AQS(AbstractQueuedSynchronizer类)是一个用来构建锁和同步器的框架 ...
- unity3d开发的android应用中增加AD系统的详细步骤
unity3d开发的android应用中增加AD系统的详细步骤 博客分类: Unity3d unity3d Unity3d已经支持android,怎样在程序里增加admob? 试了一下,确实能够, ...
- 【计蒜客2017NOIP模拟赛1】
D1T1 题面 题解:一开始以为傻题,旋转个坐标系就行了,结果光荣爆零~ 结果发现旋转坐标系后,由于多了一些虚点,锤子砸到虚点上了~gg [没有代码] D1T2 题面 题解:计算出每个边对答案的贡献即 ...
- SEO大师分析的八条
- mysql-test-run.pl
wget https://raw.githubusercontent.com/mysql/mysql-server/5.7/mysql-test/mysql-test-run.pl