How to run functions in parallel?

后端 未结 6 1032
我在风中等你
我在风中等你 2020-11-22 10:32

I researched first and couldn\'t find an answer to my question. I am trying to run multiple functions in parallel in Python.

I have something like this:



        
6条回答
  •  感情败类
    2020-11-22 11:10

    If you are a windows user and using python 3, then this post will help you to do parallel programming in python.when you run a usual multiprocessing library's pool programming, you will get an error regarding the main function in your program. This is because the fact that windows has no fork() functionality. The below post is giving a solution to the mentioned problem .

    http://python.6.x6.nabble.com/Multiprocessing-Pool-woes-td5047050.html

    Since I was using the python 3, I changed the program a little like this:

    from types import FunctionType
    import marshal
    
    def _applicable(*args, **kwargs):
      name = kwargs['__pw_name']
      code = marshal.loads(kwargs['__pw_code'])
      gbls = globals() #gbls = marshal.loads(kwargs['__pw_gbls'])
      defs = marshal.loads(kwargs['__pw_defs'])
      clsr = marshal.loads(kwargs['__pw_clsr'])
      fdct = marshal.loads(kwargs['__pw_fdct'])
      func = FunctionType(code, gbls, name, defs, clsr)
      func.fdct = fdct
      del kwargs['__pw_name']
      del kwargs['__pw_code']
      del kwargs['__pw_defs']
      del kwargs['__pw_clsr']
      del kwargs['__pw_fdct']
      return func(*args, **kwargs)
    
    def make_applicable(f, *args, **kwargs):
      if not isinstance(f, FunctionType): raise ValueError('argument must be a function')
      kwargs['__pw_name'] = f.__name__  # edited
      kwargs['__pw_code'] = marshal.dumps(f.__code__)   # edited
      kwargs['__pw_defs'] = marshal.dumps(f.__defaults__)  # edited
      kwargs['__pw_clsr'] = marshal.dumps(f.__closure__)  # edited
      kwargs['__pw_fdct'] = marshal.dumps(f.__dict__)   # edited
      return _applicable, args, kwargs
    
    def _mappable(x):
      x,name,code,defs,clsr,fdct = x
      code = marshal.loads(code)
      gbls = globals() #gbls = marshal.loads(gbls)
      defs = marshal.loads(defs)
      clsr = marshal.loads(clsr)
      fdct = marshal.loads(fdct)
      func = FunctionType(code, gbls, name, defs, clsr)
      func.fdct = fdct
      return func(x)
    
    def make_mappable(f, iterable):
      if not isinstance(f, FunctionType): raise ValueError('argument must be a function')
      name = f.__name__    # edited
      code = marshal.dumps(f.__code__)   # edited
      defs = marshal.dumps(f.__defaults__)  # edited
      clsr = marshal.dumps(f.__closure__)  # edited
      fdct = marshal.dumps(f.__dict__)  # edited
      return _mappable, ((i,name,code,defs,clsr,fdct) for i in iterable)
    

    After this function , the above problem code is also changed a little like this:

    from multiprocessing import Pool
    from poolable import make_applicable, make_mappable
    
    def cube(x):
      return x**3
    
    if __name__ == "__main__":
      pool    = Pool(processes=2)
      results = [pool.apply_async(*make_applicable(cube,x)) for x in range(1,7)]
      print([result.get(timeout=10) for result in results])
    

    And I got the output as :

    [1, 8, 27, 64, 125, 216]
    

    I am thinking that this post may be useful for some of the windows users.

提交回复
热议问题