python池映射和apply_async

时间:2017-08-19 17:41:08

标签: python multiprocessing python-multiprocessing

我正在尝试了解以下示例中的mapapply_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))

我正在尝试做三件事:

    在使用opmap部分设置operate之后
  1. number1作为关键字传递给number2(但我目前正在获得AttributeError: 'list' object has no attribute 'get' })
  2. 让操作*/超时并分别返回*/作为timeout_list中的超时结果
  3. 如何通过apply_async实现以下目标?有什么区别?

1 个答案:

答案 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)
                   )
  1. number1 == kwargs dict
  2. number2 == ops[x]
  3. op == None,因为您只使用 2 参数
  4. timeout_list == None,因为您只使用 2 参数
  5.   

    问题:...部分设置使用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运行。