不好意思,(对不起,我的英语不好) 我有一个问题,当我使用python logstash异步时,例如:
try:
crawler_logger = logging.getLogger(self.logger_index)
crawler_logger.setLevel(self.log_host_level)
crawler_logger.addHandler(AsynchronousLogstashHandler(self.host, self.port, database_path=self.database_path))
if type(content) == str:
crawler_logger.info(self.logger_index + ' : ' + content)
elif type(content) == dict or type(content) == list:
crawler_logger.info(self.logger_index + ' : ' + json.dumps(content, ensure_ascii=False))
# crawler_logger.removeHandler(AsynchronousLogstashHandler(self.host, self.port, database_path=self.database_path))
return True
except Exception as e:
return str(e)
它可以写在日志服务器中。但是当我使用进程时,例如:
def test_processes():
processes = []
for process_num in range(0, 11):
time.sleep(1)
process = Process(target=test_process)
process.start()
processes.append(process)
for process in processes:
process.join()
它不会哭。我的Log服务器什么都没有,test_process()
是第一个代码块,我想知道为什么,非常感谢!
答案 0 :(得分:1)
假设您使用的是Unix
AsynchronousLogstashHandler
使用专用线程来异步传送日志。
这会使您的主进程成为多线程,在这种情况下,多进程文档建议不要使用默认的fork方法来创建新进程:
叉子
父进程使用os.fork()派生Python解释器。 子进程开始时实际上与 父进程。父级的所有资源均由子级继承 处理。请注意,安全地分叉多线程进程是 有问题的。
仅在Unix上可用。 Unix上的默认设置。
在创建新的进程/池之前,请尝试:
multiprocessing.set_start_method('spawn')