多种用途
lets的Python项目详细描述
gevent的实用程序。
有几个gevent.Greenlet子类:
- ^ TT2}$——最大化GeEnter环境中的多核使用。
- Transparentlet–保留exc_信息,而不是打印异常
等等:
- ObjectPool–池对象。(例如连接池)
请参阅下一个示例
示例
bcrypt
的processletbcrypt是一个用于散列密码的库散列非常重 CPU绑定任务你不能保证只与gevent并发。使用 Processlet取而代之:
importbcryptimportgeventfromletsimportProcesslet# bcrypt.hashpw is very heavy cpu-bound task. it can spend a few seconds.defhash_password(password,salt=bcrypt.gensalt()):returnbcrypt.hashpw(str(password),salt)deftictoc(delay=0.1):whileTrue:print'.'gevent.sleep(delay)passwords=['alfa','bravo','charlie','delta','echo','foxtrot','golf','hotel','india','juliett','kilo','lima','mike','november','oscar','papa','quebec','romeo','sierra','tango','uniform','victor','whiskey','xray','yankee','zulu']# start tictocgevent.spawn(tictoc)# Greenlet, tictoc pauses for a few secondsgreenlet=gevent.spawn(hash_password,passwords[0])password_hash_0=greenlet.get()# Processlet, tictoc never pausesprocesslet_1=Processlet.spawn(hash_password,passwords[1])processlet_2=Processlet.spawn(hash_password,passwords[2])password_hash_1=processlet_1.get()password_hash_2=processlet_2.get()
您还可以使用ProcessPool限制子进程的数量:
importmultiprocessingfromletsimportProcessPoolpool_size=max(multiprocessing.cpu_count()-1,1)pool=ProcessPool(pool_size)password_hashes=pool.map(hash_password,passwords)
Memcached连接池
Greenlet安全连接池可以通过ObjectPool轻松实现:
importmemcachefromletsimportObjectPoolmc_pool=ObjectPool(10,memcache.Client,[('localhost',11211)])defsave(key,val):withmc_pool.reserve()asmc:mc.set(key,val)forx,password_hashinenumerate(password_hashes):gevent.spawn(save,'password_hashes[%d]'%x,password_hash)gevent.wait()