我正在使用并行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
答案 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?