我想在我的一个测试函数中实现异步工作。 功能启发式,看起来像这样 -
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的正确方法
答案 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
,则可能无法修补它,并且它会像往常一样顺序工作。