Skip to main content
 首页 » 编程设计

python之多处理 imap 抑制子进程打印

2025年05月04日26zhujiabin

当我在 Jupyter notebook (python3.5) 中运行以下代码时:

def process(doc): 
    print('Process Hey!') 
with Pool() as pool: 
    results = pool.imap(process, docs) 

这不会给笔记本打印,但如果我尝试改用 pool.map,它会吐出文字。所以我真的很好奇这里发生了什么。谢谢!

请您参考如下方法:

来自文档 imap map() 的懒惰版本,imap 返回一个迭代器 map 返回一个列表:

In [24]:  with Pool() as pool: 
            results = pool.map(process, docs) 
            print(type(results)) 
   ....:      
Process Hey! 
Process Hey! 
<class 'list'> 
 
 
In [25]:  with Pool() as pool: 
                results = pool.imap(process, docs) 
                print(type(results)) 
   ....:      
<class 'multiprocessing.pool.IMapIterator'> 
 
In [27]:  with Pool() as pool: 
                results = pool.imap(process, docs) 
                for _ in results: 
                     pass 
   ....:      
Process Hey! 
Process Hey! 
In [28]:  with Pool() as pool: 
            results = pool.imap(process, docs) 
            list(results) 
 ....:      
Process Hey! 
Process Hey! 

相当于python2中itertools.imap和map的区别,懒惰求值vs贪婪求值:

In [3]: from itertools import imap 
 
In [4]: r = imap(lambda x: x+1, [1,2,3]) 
In [4]: r 
Out[5]: <itertools.imap at 0x7f09170f1e10> 
In [6]: list(r) 
Out[6]: [2, 3, 4] 
 
In [7]: r = map(lambda x: x+1, [1,2,3])     
In [8]: r 
Out[8]: [2, 3, 4]