使用并行python时记录

时间:2013-06-05 07:25:15

标签: python logging parallel-python

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

以下是它的工作原理。每当有来自客户端的请求时,我都有一个服务器正在调用一个工作服务器:

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

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

服务器a 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函数的子进程发回的内容?

感谢您的帮助!

Romanzo

1 个答案:

答案 0 :(得分:1)

当我尝试编写将结果写入共享字典的并行测试时,我遇到了类似的问题。 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 在这里:How should I log while using multiprocessing in Python?