pythongeventthread(为什么python多线程还要比gevent要快一点)

1.为什么 python 多线程还要比 gevent 要快一点

#coding=utf-8import requestsimport threadingimport timeimport Queuegeturl=' Python中的thread的使用 通过 thread.start_new_thread 方法 import thread import time# Define a function for the thread def print_time( threadName, delay):count = 0 while count < 5:time.sleep(delay) count += 1 print "%s: %s" % ( threadName, time.ctime(time.time()) )# Create two threads as follows try:thread.start_new_thread( print_time, ("Thread-1", 2, ) ) thread.start_new_thread( print_time, ("Thread-2", 4, ) ) except:print "Error: unable to start thread" while 1:pass 通过继承thread#!/usr/bin/python import threading import time exitFlag = 0 class myThread (threading.Thread):def __init__(self, threadID, name, counter):threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter def run(self):print "Starting " + self.name print_time(self.name, self.counter, 5) print "Exiting " + self.name def print_time(threadName, delay, counter):while counter:if exitFlag:threadName.exit() time.sleep(delay) print "%s: %s" % (threadName, time.ctime(time.time())) counter -= 1# Create new threads thread1 = myThread(1, "Thread-1", 1) thread2 = myThread(2, "Thread-2", 2)# Start new Threads thread1.start() thread2.start() print "Exiting Main Thread" 线程的同步#!/usr/bin/python import threading import time class myThread (threading.Thread):def __init__(self, threadID, name, counter):threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter def run(self):print "Starting " + self.name# Get lock to synchronize threads threadLock.acquire() print_time(self.name, self.counter, 3)# Free lock to release next thread threadLock.release() def print_time(threadName, delay, counter):while counter:time.sleep(delay) print "%s: %s" % (threadName, time.ctime(time.time())) counter -= 1 threadLock = threading.Lock() threads = []# Create new threads thread1 = myThread(1, "Thread-1", 1) thread2 = myThread(2, "Thread-2", 2)# Start new Threads thread1.start() thread2.start()# Add threads to thread list threads.append(thread1) threads.append(thread2)# Wait for all threads to complete for t in threads:t.join() print "Exiting Main Thread" 利用multiprocessing多进程实现并行 进程的创建 Python 中有一套类似多线程API 的的类来进行多进程开发: multiprocessing 这里是一个来自官方文档的例子:from multiprocessing import Process def f(name):print 'hello', name if __name__ == '__main__':p = Process(target=f, args=('bob',)) p.start() p.join() 类似与线程,一可以通过继承process类来实现:from multiprocessing import Process class Worker(Process):def run(self):print("in" + self.name) if __name__ == '__main__':jobs = [] for i in range(5):p = Worker() jobs.append(p) p.start() for j in jobs:j.join() 进程的通信 Pipe() pipe()函数返回一对由双向通信的管道连接的对象,这两个对象通过send, recv 方法实现 信息的传递 from multiprocessing import Process, Pipe def f(conn):conn.send([42, None, 'hello']) conn.close() if __name__ == '__main__':parent_conn, child_conn = Pipe() p = Process(target=f, args=(child_conn,)) p.start() print parent_conn.recv() # prints "[42, None, 'hello']" p.join() Quene from multiprocessing import Process, Queue def f(q):q.put([42, None, 'hello']) if __name__ == '__main__':q = Queue() p = Process(target=f, args=(q,)) p.start() print q.get() # prints "[42, None, 'hello']" p.join() 进程间的同步 Python 中多进程中也有类似线程锁的概念,使用方式几乎一样:from multiprocessing import Process, Lock 。

pythongeventthread

3.python协程gevent怎么用

在学习gevent之前,你肯定要知道你学的这个东西是什么。

官方描述geventgevent is a coroutine-based Python networking library that uses greenlet to provide a high-level synchronous API on top of the libev event loop.翻译:gevent是一个基于协程的Python网络库。我们先理解这句,也是这次学习的重点——协程。

wiki描述协程与子例程一样,协程也是一种程序组件。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。

子例程的起始处是惟一的入口点,一旦退出即完成了子例程的执行,子例程的一个实例只会返回一次;协程可以通过yield来调用其它协程。通过yield方式转移执行权的协程之间不是调用者与被调用者的关系,而是彼此对称、平等的。

协程允许多个入口点,可以在指定位置挂起和恢复执行。没看懂?没关系,我也没看懂,不过算是有点线索:子例程。

子例程过程有两种,一种叫子例程(Subroutine),通常叫Sub;另一种叫函数(Function)。底层实现机制是一样的,区别在于,Sub只执行操作,没有返回值;Function不但执行操作,并且有返回值。

用过VB的应该会比较清楚这点。(原谅我用了百度百科)说到底子例程就是过程,我们一般叫它函数。

说到函数,我就想吐槽了,不明白为什么要叫函数。很多时候我们写一个函数是为了封装、模块化某个功能,它是一个功能、或者说是一个过程。

因为它包含的是类似于流程图那样的具体逻辑,先怎样做,然后怎样做;如果遇到A情况则怎样,如果遇到B情况又怎样。个人觉得还是叫过程比较好,叫做函数就让人很纠结了,难道因为回归到底层还是计算问题,出于数学的角度把它称为函数?这个略坑啊!为了符合大家的口味,我还是称之为函数好了(其实我也习惯叫函数了%>_讲到函数,我们就往底层深入一点,看看下面的代码: a():print "a start"b()print "a end"def b():print "b start"c()print "b end"def c():print "c start"print "c end"if __name__ == "__main__":a()a startb startc startc endb enda end对于这样的结果大家肯定不会意外的。

每当函数被调用,就会在栈中开辟一个栈空间,调用结束后再回收该空间。假设一个这样的场景:有个讲台,每个人都可以上去发表言论,但是每次讲台只能站一个人。

现在a在上面演讲,当他说到“大家好!”的时候,b有个紧急通知要告诉大家,所以a就先下来让b讲完通知,然后a再上讲台继续演讲。如果用函数的思想模拟这个问题,堆栈示意图是这样的:大家会不会发现问题,就是b通知完a继续演讲都要重新开始。

因为函数在重新调用的时候,它的局部变量是会被重置的,对于之前他说的那句“大家好”,他是不会记得的(可能a的记性不好)。那有没有什么办法可以不让他重复,而是在打断之后继续呢?很简单,在他走下讲台之前记住当前说过的话。

表现在函数中就是在退出之前,保存该函数的局部变量,方便在重新进入该函数的时候,能够从之前的局部变量开始继续执行。升级版如果你有一段代码生产数据,另外一段代码消费数据,哪个应该是调用者,哪个应该是被调用者?例如:生产者 —— 消费者问题,先抛开进程、线程等实现方法。

假设有两个函数producer和consumer,当缓冲区满了,producer调用consumer,当缓冲区空了,consumer调用producer,但是这样的函数互相调用会出什么问题?Python12345678def producer():print "生产一个"consumer()def consumer():print "消费一个"producer()producer生产一个,缓冲区满了,consumer消费一个,缓冲区空了,producer生产一个,如此循环。会看到下面这样的图:看起来好像不错,感觉两个函数协调运行的很好,很好的解决了生产者——消费者问题。

如果真有这么好也就不会有协程的存在了,仔细分析会有两个问题:无限次数的函数嵌套调用,而没有函数返回,会有什么样的后果?两个函数貌似协调有序的工作,你来我往,但每次执行的都是同一个函数实例吗?首先,上面的伪代码示例是一个无限的函数嵌套调用,没有函数返回来释放栈,栈的空间不断的在增长,直到溢出,程序崩溃。然后,看起来两个函数协调有序,事实上操作的都不是同一个实例对象,不知道下面的图能否看懂。

那什么东西有这样的能力呢?我们很快就可以想到进程、线程,但是你真的想使用进程、线程如此重量级的东西在这么简单的程序上吗?野蛮的抢占式机制和笨重的上下文切换!还有一种程序组件,那就是协程。它能保留上一次调用时的状态,每次重新进入该过程的时候,就相当于回到上一次离开时所处逻辑流的位置。

协程的起始处是第一个入口点,在协程里,返回点之后是接下来的入口点。协程的生命期完全由他们的使用的需要决定。

每个协程在用yield命令向另一个协程交出控制时都尽可能做了更多的工作,放弃控制使得另一个协程从这个协程停止的地方开始,接下来的每次协程被调用时,都是从协程返回(或yield)的位置接着执行。从上面这些你就可以知道其实协程是模拟了多线程(或多进程。

4.python gevent 能解决并发状态吗

1. gevent.server.StreamServer 会针对每个客户端连接启动一个greenlet处理,要注意的是,如果不循环监听( 阻塞在read ),

每个greenlet会在完成后立即退出,从而导致客户端退出( 发送FIN_ACK给客户端 )。这个问题折腾了一晚上,终于弄明白了。坑爹啊。

2. 要非常仔细的检查,greenlet处理的代码,发现有可能阻塞IO的地方,尽量用gevent提供的库。

3. 一些第三方库隐藏了自己的实现( 通常是直接封装C库),要使得gevent兼容它们,可以用monkey_patch,但不保证全部管用。

4. 最后最后的一点,gevent的greenlet性能非常高,所以如果是用它作为并发的client端,那么一定要注意,你的server端处理速度一定要足够快!

否则你的客户端代码会因为服务端的慢速,而失去了greenlet的优势。

5.gevent怎么编译

在gevent中主要使用Greenlet,给Python提供一个轻量级的协同程序,作为一个C的扩展模块.Greenlets主程序运行的所有系统进程是合理安排的. 这不同于任何multiprocessing或者multithreading提供的库和POSIX线程,这是真正的并行多处理器或多线程库提供真正的并行结构首先感谢作者给我的帮助我参考老方法编译gevent1.0rc2成功但是无法运行Goagent最新版只能运行2.17原因就是缺少python2.7的支持现在博主给出啦方法搬过来方便大家Tomato中python2.7+gevent1.0rc2环境的搭建之前因为没有搜索到在Tomato中编译安装gevent的教程,就自己琢磨出来Tomato中python2.6+gevent0.13.8环境的搭建方法(点击这里查看),文章发布之后收到了众多的反馈。

虽然Python官网当中的gevent最新版本为0.13.8,但Github上的gevent源码已经更新到了1.0rc2,最新版的Goagent本地客户端也集成的是gevent1.0rc2,在整合了一些反馈之后,在自己的路由器上成功更新了python和gevent。首先卸载路由当中的python2.6及其相关组件,运行:ipkg -force-removal-of-dependent-packages remove python26rm -rf /opt/local/lib/python2.6 #若挂载路径非/opt请自行修改rm -rf /opt/lib/python2.6之后更新、安装所需要的依赖包:ipkg updateipkg upgradeipkg install busybox buildroot make grep openssl openssl-dev libuclibc++ wget-ssl python27 py27-setuptools安装完成之后,我们要修复几个py27-setuptools当中的小错误。

首先easy_install的安装路径莫名其妙的指向了python2.5,不知是否只有我遇到了这个问题。修改 /opt/lib/python2.7/distutils/distutils.cfg 文件,将1site-dirs = /opt/local/lib/python2.5/site-packages修改为1site-dirs = /opt/local/lib/python2.7/site-packages其次easy_install的安装临时目录指向了/tmp目录,会造成安装某些组件时tmp剩余空间不足而导致的安装失败,我们要手动将其指定到挂载的U盘当中。

在/opt中创建tmp文件夹,修改 /opt/lib/python2.7/site-packages/setuptools/command/easy_install.py 文件,找到412行:1tmpdir = tempfile.mkdtemp(prefix="easy_install-")将其修改为:1tmpdir = tempfile.mkdtemp(prefix="easy_install-",dir="/opt/tmp")然后就可以使用easy_install安装greenlet与cython了(此步骤花费时间奇长无比):easy_install-2.7 greenleteasy_install-2.7 cythonln -s /opt/local/bin/cygdb /opt/bin/cygdb ln -s /opt/local/bin/cython /opt/bin/cython之后下载gevent:cd /opt/opt/bin/wget /downloads/Sit 。 event-1.0rc2.tar.gz --no-check-certificatetar zxvf gevent-1.0rc2.tar.gzcd gevent-1.0rc2直接编译会报错,因为使用了mips2的sync指令,在Goagent的issues上找到了答案。

心得编译前记得开启虚拟内存修改 /libev/ev.c 文件,找到604行的:参考/p/goagent/issues/detail?id=78231#define ECB_MEMORY_FENCE __asm__ __volatile__ ("sync" : : : "memory")修改为:#define ECB_MEMORY_FENCE __asm__ __volatile__ (".set mips2; sync; .set mips0": : :"memory") 执行python2.7 setup.py install下载并安装pyOpenSSLcd /optwget http://pypi.python.org/packages/source/p/pyOpenSSL/pyOpenSSL-0.12.tar.gztar zxvf pyOpenSSL-0.12.tar.gzcd pyOpenSSL-0.12python2.7 setup.py install安装结束之后,运行Goagent可能会提示.python-eggs错误,我们可以手动指定缓存目录。修改Goagent的proxy.py文件,在:1import os下一行添加:1os.environ['PYTHON_EGG_CACHE'] = '/opt/.python-eggs'或者可以将 gevent-1.0rc2-py2.7-linux-mips.egg 解包:cd /opt/local/lib/python2.7/site-packagesmv gevent-1.0rc2-py2.7-linux-mips.egg gevent-1.0rc2-py2.7-linux-mips.egg.zipmkdir gevent-1.0rc2-py2.7-linux-mips.eggcd gevent-1.0rc2-py2.7-linux-mips.eggunzip /opt/local/lib/python2.7/site-packages/gevent-1.0rc2-py2.7-linux-mips.egg.zip再次运行Goagent,应该不会再有错误提示了。

pythongeventthread

转载请注明出处代码入门网 » pythongeventthread(为什么python多线程还要比gevent要快一点)

资讯

python函数返回元组(如何使用python函数返回值)

阅读(23)

本文主要为您介绍python函数返回元组,内容包括python函数可以返回列表元组吗,python编写程序,利用元组作为函数的返回值,求系列类型的最大值、,python中return返回的一定是元组么??。函数的尾部 return 要是用的返回值def roll_dice(number

资讯

python代码管理(如何管理Python模块)

阅读(17)

本文主要为您介绍python代码管理,内容包括python测试代码怎么管理,如何管理Python模块,如何管理自己写的python脚本。1. 直接copy 下载的模块文件中已经有了模块的文件,有些模块只有一个文件,比如较早版本的BeautifulSoup,有些是一个文件夹

资讯

python主函数传参数(Python的函数是怎么传递参数的?)

阅读(22)

本文主要为您介绍python主函数传参数,内容包括Python的函数是怎么传递参数的?,python怎么向类中的函数传递参数,python中参数传递的方式是什么。首先你要明白,Python的函数传递方式是赋值,而赋值是通过建立变量与对象的关联实现的。对于你的

资讯

python系统定义名字(python标识符命名规则)

阅读(19)

本文主要为您介绍python系统定义名字,内容包括python怎么使用lambda定义有名字的函数,python标识符命名规则,python的name是什么意思。文件名全小写,可使用下划线包应该是简短的、小写的名字。如果下划线可以改善可读性可以加入。如mypackag

资讯

python字符串数组遍历(python同时遍历数组和字典的方法)

阅读(25)

本文主要为您介绍python字符串数组遍历,内容包括python怎么遍历一个数组,python中的字符串数组怎样实现,python中的字符串数组怎样实现。我用的是3.3.直接在Shell一个一个打,很简单呀,你没多动手亲。。d1=dict()>>> d2=dict()>>> d1[key1

资讯

python3.0教程pdf(如何入门Python3?)

阅读(22)

本文主要为您介绍python3.0教程pdf,内容包括如何入门Python3?,刚开始学openERP+Python,如何快速入门?,求推荐python3.x的教程(实体、电子教程均可)。目前教程大部分是基于Python2的,但其中部分教程中会指出如果代码在3中运行需要注意或改动

资讯

pythonpycharm搭建(如何用pycharm搭建python)

阅读(20)

本文主要为您介绍pythonpycharm搭建,内容包括如何用pycharm搭建python,pycharm怎么配置python,python怎么和pycharm进行配置。安装的时候勾选path 3.安装完成后打开cmd 输入python查看安装是贵客成功4.新建一个文件hello.py 键入pinrt("

资讯

python3生成pdf(在python里用怎么转化pdf文件)

阅读(25)

本文主要为您介绍python3生成pdf,内容包括在python里用怎么转化pdf文件,python怎么将数据整合生成pdf,python怎么把数据导出pdf,doc,xls,html,csv格式51cto。只要是可以打印,就可以使用虚拟打印机来处理:方法一:使用虚拟打印机pdf factory即可

资讯

python可视化开发工具(求一款好用的python图形化编程工具)

阅读(27)

本文主要为您介绍python可视化开发工具,内容包括python的可视化编程软件,python的可视化编程软件,求一款好用的python图形化编程工具。你想多了,Python的长处不在于图形化编程,当然它也能做,在应用上可能更多用于后台,不需要图形界面。如果想用

资讯

python写登录脚本(如何使用Python编写自动登录的脚本)

阅读(23)

本文主要为您介绍python写登录脚本,内容包括如何使用Python编写自动登录的脚本,python自动登录CSDN的脚本怎么实现?,如何用python写一个安卓app自动登录代码。#!/usr/bin/expect -fset password 12345678spawn ssh name@###.###.###e

资讯

pythontwisted广播(局域网如何互连?)

阅读(1)

本文主要为您介绍pythontwisted广播,内容包括pythonPyTorch用matmul写矩阵相乘函数时,怎么让函数可以广播?,局域网如何互连?,学习python能干什么???。网络互连的目的:是将多个网络互相连接,以实现在更大范围内的信息交换资源共享和协同工作。

资讯

python精要参考pudn(python四种基本数据类型)

阅读(1)

本文主要为您介绍python精要参考pudn,内容包括python四种基本数据类型,要学习python需要学习哪些知识?,零基础如何开始学习Python?如何入门?。python是相当高级的语言,基本数据类型就很多,不过参考其他语言的,一定要四个的话:整形 int定义:age=1

资讯

python百分数加减(python如何进行多项式的加减乘除)

阅读(2)

本文主要为您介绍python百分数加减,内容包括python中,如何计算变量与百分数的结果?,python如何进行多项式的加减乘除,扩句(有要求)将下面的句子扩展成一句话,。如何进行多项式的加减乘除?这个题目太大!12个字,写出来很简单,答案却是初中教材上

资讯

wsgipython开发(如何创建部署WSGI类型的Python应用)

阅读(2)

本文主要为您介绍wsgipython开发,内容包括如何创建部署WSGI类型的Python应用,如何创建部署WSGI类型的Python应用,如何部署pythonweb程序。第一部分:安装必要工具。1.因为这是部署Python开发环境,所以安装pip可以简化一些软件的安装过程。(PIP

资讯

python集成测试框架(最受欢迎的Python开源框架有哪些)

阅读(1)

本文主要为您介绍python集成测试框架,内容包括最受欢迎的Python开源框架,企业级软件开发需要什么样的框架,Python企业应用到底如何?。Django: Python Web应用开发框架Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响。D

资讯

python数据驱动测试(python中什么是测试数据和训练数据)

阅读(1)

本文主要为您介绍python数据驱动测试,内容包括python中什么是测试数据和训练数据,python学到什么程度就能满足测试需要,如何用python抓取js生成的数据:。当数据量特别大的时候,有几千几万条,为了验证模型的好坏,取出一部分用于训练,另一部分用