使用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
,它可能不会被打补丁,它将照常按顺序工作。