lets 0.1.6

Creator: bradpython12

Last updated:

Add to Cart

Description:

lets 0.1.6

Utilities for gevent.
There’re several gevent.Greenlet subclasses:

Processlet – maximizing multi-core use in gevent environment.
Transparentlet – keeping exc_info rather than printing exception.

And etc.:

ObjectPool – pooling objects. (e.g. connection pool)

See the next examples.

Examples

Processlet for bcrypt
bcrypt is a library to hash password. That the hashing is very heavy
CPU-bound task. You can’t guarantee concurrency with only gevent. Use
Processlet instead:
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()
You can also limit the number of child processes with 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 connection pool
Greenlet-safe connection pool can be easily implemented by 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()



Links

GitHub repository
development version

License

For personal and professional use. You cannot resell or redistribute these repositories in their original state.

Customer Reviews

There are no reviews.