使用Greenlet值

时间:2017-07-07 08:47:26

标签: python asynchronous concurrency gevent greenlets

我想在我的一个测试函数中实现异步工作。 功能启发式,看起来像这样 -

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的正确方法

1 个答案:

答案 0 :(得分:1)

将单个会话的代码放入单个函数中,如下所示:

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-patch all,然后使用创建任务     tasks = [Greenlet.spawn(check_session)for i in range(10000)]     任务中的任务:         task.run()

将启动所有任务。请注意,greenlet不会并行运行 - 它们只会阻塞输入/输出(如网络套接字),然后另一个将开始执行。如果你花费大部分时间等待网络,他们应该加快速度。如果没有,不是。

如果您使用某些特定或自定义代码来访问网络,也要小心。 monkey.patch_all()用gevent版本替换Python套接字代码(和磁盘i / o等),这样可以产生另一个greenlet而不是等待。如果您的代码没有使用socket,则可能无法修补它,并且它会像往常一样顺序工作。