Python:不要映射 multiprocessing.Pool( ) 的空结果

And*_*kov 3 python multithreading dictionary

程序具有可能返回 None 值的函数,以最大限度地减少在并行工作人员中调用该函数的时间。在下面的代码中,该函数的结果具有“None”值,如何从“ret”中排除该值?

#!/usr/bin/python
import sys,multiprocessing,time
maxNumber = sys.maxint+2

def numGen():
    cnt=0
    while cnt < maxNumber:
        cnt +=1
        yield cnt

def oddCheck(num):
    global maxNumber
    # time.sleep(1)
    if not bool(num%1000000):
        print "[%s%%] %s" % (int((num/maxNumber)*100),num)
    if num%2:
        return num

pool = multiprocessing.Pool( )
if sys.maxint < maxNumber:
    print "We have problem on %s"%sys.maxint
    # quit()
ret = pool.imap(oddCheck, numGen())
pool.close()
pool.join()

for x in ret:
    print x
Run Code Online (Sandbox Code Playgroud)

aru*_*aku 5

oddCheckNone当不是偶数时返回num(在这种情况下没有 return 语句,因此None将被返回)。

如果您想避免None结果,只需使用列表理解来过滤它们:

ret = [x for x in pool.imap(oddCheck, numGen()) if x is not None]
Run Code Online (Sandbox Code Playgroud)

它应该可以解决问题;-)

  • 有没有办法防止“None”成为“pool.imap()”返回结果的一部分,而不是事后过滤它? (2认同)