[英]Python multiprocessing pool force distribution of process
出现此问题的原因是尝试将日志记录与多处理池结合在一起。 在Linux下,无需执行任何操作。 包含我的池工作程序方法的模块继承了主应用程序记录器属性。 在Windows下,我必须在每个进程中初始化记录器,这是通过使用initializer方法运行pool.map_async来完成的。 问题在于该方法运行得如此之快,以致于它在某些进程中不止一次执行,而在另一些进程中则根本不执行。 如果在该方法上添加短时间延迟,我可以使其正常工作,但这似乎不太好。
有没有一种方法可以强制池平均分配进程?
(某些背景: http : //plumberjack.blogspot.de/2010/09/using-logging-with-multiprocessing.html )
代码如下,我不能真正发布整个模块;-)调用是这样的:
# Set up logger on Windows platforms
if os.name == 'nt':
_ = pool.map_async(ml.worker_configurer,
[self._q for _ in range(mp.cpu_count())])
ml.worker_configurer函数是这样的:
def worker_configurer(queue, delay=True):
h = QueueHandler(queue)
root = logging.getLogger()
root.addHandler(h)
root.setLevel(logging.DEBUG)
if delay:
import time
time.sleep(1.0)
return
新工作者配置器
def worker_configurer2(queue):
root = logging.getLogger()
if not root.handlers:
h = QueueHandler(queue)
root.addHandler(h)
root.setLevel(logging.DEBUG)
return
您可以执行以下操作:
sub_logger = None
def get_logger():
global sub_logger
if sub_logger is None:
# configure logger
return sub_logger
def worker1():
logger = get_logger()
# DO WORK
def worker2():
logger = get_logger()
# DO WORK
pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
result = pool.map_async(worker1, some_data)
result.get()
result = pool.map_async(worker2, some_data)
result.get()
# and so on and so forth
因为每个进程都有自己的内存空间(因此是自己的全局变量集),所以可以将初始全局记录器设置为“ None
并且仅在以前未配置的情况下才配置记录器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.