跳转到主要内容

几个gevent工具

项目描述

gevent的实用工具。

有多个gevent.Greenlet子类

  • Processlet – 在gevent环境中最大化多核使用。

  • Transparentlet – 保持exc_info而不是打印异常。

等等。

  • ObjectPool – 对象池。 (例如连接池)

查看以下示例。

示例

bcrypt的Processlet

bcrypt 是一个用于哈希密码的库。哈希是一个非常重的CPU密集型任务。你不能只使用gevent来保证并发。请使用Processlet

import bcrypt
import gevent
from lets import Processlet

# bcrypt.hashpw is very heavy cpu-bound task.  it can spend a few seconds.
def hash_password(password, salt=bcrypt.gensalt()):
    return bcrypt.hashpw(str(password), salt)

def tictoc(delay=0.1):
    while True:
        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 tictoc
gevent.spawn(tictoc)

# Greenlet, tictoc pauses for a few seconds
greenlet = gevent.spawn(hash_password, passwords[0])
password_hash_0 = greenlet.get()

# Processlet, tictoc never pauses
processlet_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限制子进程的数量

import multiprocessing
from lets import ProcessPool

pool_size = max(multiprocessing.cpu_count() - 1, 1)
pool = ProcessPool(pool_size)
password_hashes = pool.map(hash_password, passwords)

Memcached连接池

Greenlet安全的连接池可以通过 ObjectPool轻松实现

import memcache
from lets import ObjectPool

mc_pool = ObjectPool(10, memcache.Client, [('localhost', 11211)])

def save(key, val):
    with mc_pool.reserve() as mc:
        mc.set(key, val)

for x, password_hash in enumerate(password_hashes):
    gevent.spawn(save, 'password_hashes[%d]' % x, password_hash)

gevent.wait()

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码发行版

lets-0.1.6.tar.gz (12.9 kB 查看哈希值)

上传时间 源代码

由以下提供支持