使用Greenlet值

问题描述:

我想将一个异步工作实现到我的一个测试函数中。 功能,启发式,看起来是这样的 -使用Greenlet值

def test_sessions(self): 
    sessions = [] 
    """ 
    Creating 10k session instances 
    """ 
    for i in xrange(10000): 
     sessions.append(Session.create_session(session_handle, login_params(user, pass)) 
    """ 
    Foreach session instance, check session validity by running read_dir command 
    """ 
    for session in sessions: 
     connection = Connection.create_connection(addrs, port) 
     connection.session = session.id 
     response = connection.read_dir(dir) 
    """ 
    Deleting the 10k opened sessions 
    """ 
    for session in sessions: 
     session.delete(session_handle) 

这需要为10K会话执行此项检查的时间大约是30米。因此,为了加快速度,我使用了greenlet和gevent来创建这些部分(创建,检查和删除)。

我在理解如何实现这个想法时遇到了一些麻烦,因为我无法确定如何访问将由greenlet线程创建的会话实例..我找不到任何如何实现的好例子能够使用greenlet值。

请直接与我使用greenlet这里

将单个会话的代码到一个单一的功能,这样的事情的正确方法:

def check_session() 
    session = Session.create_session(session_handle, login_params(user, pass) 
    connection = Connection.create_connection(addrs, port) 
    connection.session = session.id 
    response = connection.read_dir(dir) 
    session.delete(session_handle) 

现在你应该导入greenlet,monkey-修补所有,然后[在范围对于i Greenlet.spawn(check_session)(10000)]创建使用 任务=任务在任务的任务 : task.run()

所有吨问题将开始。请注意,greenlet不会并行运行 - 它们仅阻塞输入/输出,如网络套接字,因此另一个将开始执行。如果你的大部分时间都花在等待网络上,他们应该加速很多事情。如果没有,不是。

如果您使用一些非常特定的或自定义的代码来访问网络,请注意。 monkey.patch_all()用gevent版本代替Python套接字代码(以及磁盘I/O等),该版本产生到另一个greenlet而不是等待。如果你的代码不使用socket,它可能不会被打补丁,它将照常按顺序工作。