python – map()和imap()如何在gevent.pool.Pool中工作?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – map()和imap()如何在gevent.pool.Pool中工作?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2251字,纯文字阅读大概需要4分钟。
内容图文
![python – map()和imap()如何在gevent.pool.Pool中工作?](/upload/InfoBanner/zyjiaocheng/793/6a37d893f27c479694d7d31d099ca019.jpg)
我写了一个脚本来了解gevent.pool.Pool,但我看到了一个奇怪的手机.
在我的代码中,我有三个不同的代码段,分别是版本1,版本2和版本3.
>在评论版本2和版本3时,即仅使用版本1中的imap()方法,则没有任何事情发生.
>在注释掉版本1和版本3时,即仅使用版本2中的map()方法,然后我发现第一个map()方法创建了两个greenlet,然后执行了两个greenlet.在完成这两个greenle之后,第二个map()方法执行相同的操作.
>当注释掉版本1和版本2时,即首先使用imap()方法然后在版本3中使用map()方法,我发现在执行map()方法之前,会创建并执行五个greenlet .
所以我有两个问题:
>为什么map()方法触发执行而imap()没有?
>为什么在map()触发执行后,Pool实例的长度为非零?
我已经阅读了gevent-1.0中pool.py的源代码,但我不明白源代码如何将greenlet添加到变量self.greenlets以及map()和imap()之间的区别.在我的选项中,imap()只返回一个可迭代的对象,map()返回一个由imap()生成的greenlet列表.
以下是gevent的pool.py中map()和imap()的源代码:
def map(self, func, iterable):
return list(self.imap(func, iterable))
def imap(self, func, iterable):
"""An equivalent of itertools.imap()"""
return IMap.spawn(func, iterable, spawn=self.spawn)
这是我的测试代码:
#!/usr/bin/env python2.7
#coding: utf-8
import gevent
from gevent.pool import Pool
from gevent.coros import BoundedSemaphore
class TestSemaphore(object):
def __init__(self):
self.sem = BoundedSemaphore(1)
self.pool = Pool()
def run(self):
# version 1
self.pool.imap(self._worker, xrange(0, 2))
self.pool.imap(self._worker, xrange(3, 6))
# end of version 1
# version 2
# self.pool.map(self._worker, xrange(0, 2))
# self.pool.map(self._worker, xrange(3, 6))
# end of version 2
# version 3
# self.pool.imap(self._worker, xrange(0, 2))
# self.pool.map(self._worker, xrange(3, 6))
# end of version 3
def _worker(self, pid):
with self.sem:
print('worker %d acquired semaphore, length of pool is %d' % (pid, len(self.pool)))
gevent.sleep(0)
print('worker %d released semaphore, length of pool is %d' % (pid, len(self.pool)))
if __name__ == '__main__':
test = TestSemaphore()
test.run()
解决方法:
需要注意的关键是imap是懒惰的 – 在你实际使用生成的迭代器之前它不会做任何工作:
>>> map(lamda x: x, xrange(0, 2))
[0, 1]
>>> from itertools import imap
>>> imap(lamda x: x, xrange(0, 2))
<generator object at 0xsome-address>
# Consume the resulting iterator
>>> list(imap(lamda x: x, xrange(0, 2)))
[0, 1]
多处理和gevent中的imap遵循相同的规则.
内容总结
以上是互联网集市为您收集整理的python – map()和imap()如何在gevent.pool.Pool中工作?全部内容,希望文章能够帮你解决python – map()和imap()如何在gevent.pool.Pool中工作?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。