首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将不同的initarg传递给ProcessPoolExecutor中的不同worker

将不同的initarg传递给ProcessPoolExecutor中的不同worker
EN

Stack Overflow用户
提问于 2020-10-03 02:49:09
回答 1查看 217关注 0票数 1
代码语言:javascript
复制
In [5]: def fn(x): 
   ...:     os.environ["var_{}".format(x)] = x 
   ...:      
   ...:                                                                                                                                       
[PYFLYBY] import os

In [6]: def gn(x): 
   ...:     return os.environ["var_{}".format(x)] 
   ...:      
   ...:      
   ...:                                                                                                                                     

a = ["1", "2", "3"]

In [8]: with concurrent.futures.ProcessPoolExecutor(max_workers=3, initializer=fn, initargs=a) as e: 
   ...:     r = e.map(gn, a) 
   ...:                                                                                                                                       
Exception in initializer:
Traceback (most recent call last):
  File "/opt/python/python-3.7/lib64/python3.7/concurrent/futures/process.py", line 226, in _process_worker
    initializer(*initargs)
TypeError: fn() takes 1 positional argument but 3 were given
Exception in initializer:
Traceback (most recent call last):
  File "/opt/python/python-3.7/lib64/python3.7/concurrent/futures/process.py", line 226, in _process_worker
    initializer(*initargs)
TypeError: fn() takes 1 positional argument but 3 were given
Exception in initializer:
Traceback (most recent call last):
  File "/opt/python/python-3.7/lib64/python3.7/concurrent/futures/process.py", line 226, in _process_worker
    initializer(*initargs)
TypeError: fn() takes 1 positional argument but 3 were given

所以,基本上,我希望a传递给第一个worker,a1传递给第二个,依此类推。有没有办法做到这一点呢?现在,整个a被传递给fn,这导致了这个错误。

EN

回答 1

Stack Overflow用户

发布于 2020-10-04 04:09:06

你的例子并不完全正确,但是关于这个问题:

您可以将multiprocessing.Queue传递给初始化器函数,将特定于worker的数据放入其中,然后在每个worker进程中执行一个queue.get()

代码语言:javascript
复制
import os
import concurrent.futures
import multiprocessing
import time


def fn(q):
  x = q.get()
  os.environ["var_x"] = x


def gn(i):
  time.sleep(0.5) 
  return f"pid={os.getpid()} var_x={os.environ['var_x']}\n"

q = multiprocessing.Queue()
a = ["1", "2", "3"]
with concurrent.futures.ProcessPoolExecutor(max_workers=3, initializer=fn, initargs=(q,)) as e:
  [q.put(i) for i in a]
  print(*e.map(gn, a))

输出:

代码语言:javascript
复制
pid=1218 var_x=1
pid=1219 var_x=2
pid=1220 var_x=3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64176795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档