7

我正在使用并行 pythonexecutePipeline多次执行一个大函数 ()。此功能也使用多处理(与multiprocessing模块)。
我在使用并行 python 模块在控制台上正确显示日志消息时遇到了一些麻烦。当我不使用它时,日志消息会很好地显示。

下面是它的工作原理。我有一个服务器,它每次收到来自客户端的请求时都会调用一个工作人员:

job = self.server.job_server.submit(func = executeWorker, args = (config, ) )

每次有来自客户端的新请求时,都会从新线程执行此函数。然后工作人员正在调用executePipeline使用多处理执行不同进程的函数。

SocketServer.TCPServer我使用线程的服务器。我使用根记录器在我的服务器中设置了一个记录器,如下所示:

self.logger = logging.getLogger()
self.logger.setLevel(logging.INFO)
self.logger.addHandler(logging.StreamHandler() 
self.job_server = pp.Server(ncpus = 8) # for test
self.jobs = []

当我运行我的服务器时,我只能executePipeline从子进程而不是子进程获取日志记录。此外,我仅在作业结束时才获得执行管道的日志记录,而不是在运行时。

这里也是工人代码。在我的"Executing pipeline with worker number "终端中很好地显示

'''
Setup logging
'''

logger = logging.getLogger()
logger.setLevel(logging.INFO)  

# worker name
publicIP = socket.gethostbyname(socket.gethostname()) 
pid = os.getpid()
workerID = unicode(str(publicIP) + ":" + str(pid))

logger.info( "Executing pipeline with worker {}".format(workerID))
res = executePipeline(config)    
markedScore = res["marker.score"]
markedDetails = res["marker.detail"]
results = {'marker.detail' : markedDetails , 'marker.score' : markedScore } 

return results

有没有一种好方法也可以让日志记录正常工作并查看我的executePipeline函数的子进程发回了什么?

谢谢你的帮助!

罗曼佐

4

1 回答 1

2

当我尝试编写将结果写入共享字典的并行测试时,我遇到了类似的问题。multiprocessing.Manager是答案:

# create shared results dictionary
manager = multiprocessing.Manager()
result_dict = manager.dict({})

因此,您可以简单地将进程中的日志发布到该通用字典中,然后对其进行处理。

LOG = multiprocessing.get_logger()按照此处的说明使用:https ://docs.python.org/2/library/multiprocessing.html 和此处:在 Python 中使用多处理时如何记录?

于 2015-08-28T11:49:55.057 回答