擅长:python、mysql、java
<p>您可以使用<a href="https://docs.python.org/2/library/multiprocessing.html#multiprocessing.managers.SyncManager" rel="nofollow">SyncManager</a>类来注册您自己的类型。然后可以在该类型上实现方法,例如,只从dict获取有限数量的项</p>
<p>下面是一个让您开始的示例:</p>
<pre><code>import multiprocessing
from multiprocessing import managers
class TakerDict(dict):
"""Like a dict, but allows taking a limited number of items."""
def take(self, items=1):
"""Take the first `items` items."""
return [item for _, item in zip(range(items), self.items())]
# NOTE: add other dict methods to the tuple if you need them.
TakerProxy = managers.MakeProxyType('TakerProxy', ('take',))
managers.SyncManager.register('taker', TakerDict, TakerProxy)
if __name__ == '__main__':
manager = multiprocessing.Manager()
taker = manager.taker()
# in other processes, use e.g. taker.take(5)
</code></pre>
<p>因此,要限制内存使用,您必须反复调用管理器进程以获取下一批元素。</p>
<p>但是,要做到这一点,dict必须支持索引(这样就可以从特定的偏移量恢复)。由于您不能访问dict中元素的底层顺序,因此最好使用列表(例如<code>manager.list()</code>)。然后在您的子流程中,请求列表的<code>len()</code>,并按片索引以获得适当大小的批处理—您不需要为此注册任何代理类型。</p>