Python with关键字在打开文件时起作用,但在调用函数时不起作用

Python with关键字在打开文件时起作用,但在调用函数时不起作用,python,multiprocessing,Python,Multiprocessing,我正在试验多处理模块,并从页面复制示例代码。以下是一个例子: #!/usr/bin/python from multiprocessing import Pool from time import sleep def f(x): return x*x if __name__ == '__main__': # start 4 worker processes with Pool(processes=4) as pool: # print "[0, 1,

我正在试验多处理模块,并从页面复制示例代码。以下是一个例子:

#!/usr/bin/python
from multiprocessing import Pool
from time import sleep

def f(x):
    return x*x

if __name__ == '__main__':
    # start 4 worker processes
    with Pool(processes=4) as pool:

        # print "[0, 1, 4,..., 81]"
        print(pool.map(f, range(10)))

        # print same numbers in arbitrary order
        for i in pool.imap_unordered(f, range(10)):
            print(i)

        # evaluate "f(10)" asynchronously
        res = pool.apply_async(f, [10])
        print(res.get(timeout=1))             # prints "100"

        # make worker sleep for 10 secs
        res = pool.apply_async(sleep, [10])
        print(res.get(timeout=1))             # raises multiprocessing.TimeoutError

    # exiting the 'with'-block has stopped the pool
运行此代码后,我得到:

Traceback (most recent call last):
  File "example01.py", line 11, in <module>
    with Pool(processes=4) as pool:
AttributeError: __exit__
当我想运行上述示例时,我必须按照以下方式对其进行修改:

#!/usr/bin/python

from multiprocessing import Pool
from time import sleep
import traceback

def f(x):
    return x*x

if __name__ == '__main__':
  # start 4 worker processes
  # with Pool(processes=4) as pool:
  try:
    pool = Pool(processes = 4)

    # print "[0, 1, 4,..., 81]"
    print(pool.map(f, range(10)))

    # print same numbers in arbitrary order
    for i in pool.imap_unordered(f, range(10)):
      print(i)

    # evaluate "f(10)" asynchronously
    res = pool.apply_async(f, [10])
    print(res.get(timeout=1))             # prints "100"

    # make worker sleep for 10 secs
    res = pool.apply_async(sleep, [10])
    print(res.get(timeout=1))             # raises multiprocessing.TimeoutError

    # exiting the 'with'-block has stopped the pool

  # http://stackoverflow.com/questions/4990718/python-about-catching-any-exception
  # http://stackoverflow.com/questions/1483429/how-to-print-an-error-in-python
  # http://stackoverflow.com/questions/1369526/what-is-the-python-keyword-with-used-for
  except Exception as e:
    print "Exception happened:"
    print type(e)
    print str(e)
    print traceback.print_exc()
然后,输出如下所示:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
0
1
4
9
16
25
36
49
64
81
100
Exception happened:
<class 'multiprocessing.TimeoutError'>

Traceback (most recent call last):
  File "example01_mod.py", line 29, in <module>
    print(res.get(timeout=1))             # raises multiprocessing.TimeoutError
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 563, in get
    raise TimeoutError
TimeoutError
None
[0,1,4,9,16,25,36,49,64,81]
0
1.
4.
9
16
25
36
49
64
81
100
发生异常:
回溯(最近一次呼叫最后一次):
文件“example01_mod.py”,第29行,在
打印(res.get(timeout=1))#引发multiprocessing.TimeoutError
get中的文件“/usr/lib/python2.7/multiprocessing/pool.py”,第563行
上升时间误差
时间误差
没有一个
为什么我在使用
with
关键字时出错,这些代码(with和try-catch)是等价的吗?我正在使用python 2.7.10。

描述了使用“with”关键字所需的上下文管理器界面。Python2.7版本的Pool类不支持此接口,因此您不能按照描述的方式使用'with'关键字

您可以将代码重写为不与一起使用,并直接加入/终止池,如中所示,或者您可以升级到Python 3,它支持池的“with”。

描述了使用“with”关键字所需的上下文管理器接口。Python2.7版本的Pool类不支持此接口,因此您不能按照描述的方式使用'with'关键字

您可以将代码重写为不与一起使用,并直接加入/终止池,如中所示,或者您可以升级到Python 3,它支持池的“with”。

描述了使用“with”关键字所需的上下文管理器接口。Python2.7版本的Pool类不支持此接口,因此您不能按照描述的方式使用'with'关键字

您可以将代码重写为不与一起使用,并直接加入/终止池,如中所示,或者您可以升级到Python 3,它支持池的“with”。

描述了使用“with”关键字所需的上下文管理器接口。Python2.7版本的Pool类不支持此接口,因此您不能按照描述的方式使用'with'关键字


您可以将代码重写为不与一起使用,并直接加入/终止池,如中所示,或者您可以升级到Python 3,它不支持池的“with”。

您错误地认为。相反,它返回一个列表。池已从转换为上下文管理器对象,如果您的版本早于此,则无法将其与上下文管理器一起使用

要与with语句一起使用,表达式应使用enterexit方法返回一个对象,以便获得熟悉的错误

AttributeError: __exit_

您错误地认为返回的是a。相反,它返回一个列表。池已从转换为上下文管理器对象,如果您的版本早于此,则无法将其与上下文管理器一起使用

要与with语句一起使用,表达式应使用enterexit方法返回一个对象,以便获得熟悉的错误

AttributeError: __exit_

您错误地认为返回的是a。相反,它返回一个列表。池已从转换为上下文管理器对象,如果您的版本早于此,则无法将其与上下文管理器一起使用

要与with语句一起使用,表达式应使用enterexit方法返回一个对象,以便获得熟悉的错误

AttributeError: __exit_

您错误地认为返回的是a。相反,它返回一个列表。池已从转换为上下文管理器对象,如果您的版本早于此,则无法将其与上下文管理器一起使用

要与with语句一起使用,表达式应使用enterexit方法返回一个对象,以便获得熟悉的错误

AttributeError: __exit_

您不能将
与任何对象一起使用。对象必须是一个。不能只对任何对象使用
。对象必须是一个。不能只对任何对象使用
。对象必须是一个。不能只对任何对象使用
。对象必须是一个。您能解释一下“上下文管理器”是什么意思,以及“重写代码以不与池一起使用并直接加入池”是什么意思吗?还有,能否简单解释一下为什么它在python3中工作?我的意思是,这是池的问题,或者是python3的特性,或者是什么?谢谢你为什么在python3中可以这样做可能是由@Abhijit解释的“池是从python3.4.3转换为上下文管理器对象的,如果你的版本早于此,你就不能将它用于上下文管理器。”如果我错了,请纠正我,PS:我不是英语母语。你能解释一下“上下文管理器”是什么意思吗还有你所说的“重写代码,使其不与池一起使用并直接加入池”是什么意思?还有,能否简单解释一下为什么它在python3中工作?我的意思是,这是池的问题,或者是python3的特性,或者是什么?谢谢你为什么在python3中可以这样做可能是由@Abhijit解释的“池是从python3.4.3转换为上下文管理器对象的,如果你的版本早于此,你就不能将它用于上下文管理器。”如果我错了,请纠正我,PS:我不是英语母语。你能解释一下“上下文管理器”是什么意思吗还有你所说的“重写代码,使其不与池一起使用并直接加入池”是什么意思?还有,能否简单解释一下为什么它在python3中工作?我的意思是,这是池的问题,或者是python3的特性,或者是什么?谢谢你为什么在python3中可以这样做可能是由@Abhijit解释的“这个池是从python3.4.3转换成一个上下文管理器对象的,如果你的版本早于此,你就不能在上下文管理器中使用它。”如果我错了,请纠正我,PS:我不是英语母语。你能解释一下你的意思吗