我正在尝试了解以下示例中的map
和apply_async
(改编自here)。
from multiprocessing import Pool, Manager
from functools import partial
import time
def operate(number1=None, number2=None, op=None, timeout_list=None):
if op == "+":
return number1 + number2
elif op == "-":
time.sleep(1)
return number1 - number2
elif op == "/":
time.sleep(6)
return number1 / number2
elif op == "*":
time.sleep(10)
return number1 * number2
else:
print("+, -, /, *")
timeout_list = Manager().list()
kwargs = {"number1":10, "number2":7, "timeout_list":timeout_list}
if __name__ == '__main__':
ops = ["+", "+", "-", "*", "/", "+"]
pool = Pool(processes=len(ops))
result = pool.map(partial(operate, kwargs),ops)
print(result.get(timeout=5))
我正在尝试做三件事:
op
和map
部分设置operate
之后number1
作为关键字传递给number2
(但我目前正在获得AttributeError: 'list' object has no attribute 'get'
})*
和/
超时并分别返回*
和/
作为timeout_list
中的超时结果apply_async
实现以下目标?有什么区别?答案 0 :(得分:0)
问题:...将op作为关键字传递给地图
您有,将以下内容放入def operate(...
以查看您的操作:
def operate(number1=None, number2=None, op=None, timeout_list=None):
print('pid:{} operate({})'.format(os.getpid(), (number1, number2, op, timeout_list)))
>>>pid:4932 operate(({'number1': 10, 'number2': 7, 'timeout_list': <ListProxy object, typeid 'list' at 0xf6c0afac>},
'+',
None,
None)
)
number1
== kwargs dict
number2
== ops[x]
op
== None
,因为您只使用 2 参数timeout_list
== None
,因为您只使用 2 参数问题:...部分设置使用number1和number2进行操作
您还没有,请执行以下操作以查看partial
做了什么:
print(partial(operate, kwargs))
>>>functools.partial(<function operate at 0xf70ed194>,
{'number1': 10, 'number2': 7, 'timeout_list': <ListProxy object, typeid 'list' at 0xf70f38ec>})
问题:...获取一个AttributeError:&#39; list&#39;对象没有属性&#39; get&#39;)
仔细阅读 AttributeError !
.map(...
返回纯Python list
而不是结果对象!
print(result)
>>>[None, None, None, None, None, None]
问题:2。获取操作*和/超时并返回...
不清楚你在问什么?
问题:3。如何使用apply_async ...
实现以下目标
在你进一步开始之前,让步骤1和2运行。