Python Logstash异步不能在多个进程中使用

时间:2019-07-01 09:05:17

标签: python-3.x

不好意思,(对不起,我的英语不好) 我有一个问题,当我使用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()是第一个代码块,我想知道为什么,非常感谢!

1 个答案:

答案 0 :(得分:1)

假设您使用的是Unix

AsynchronousLogstashHandler使用专用线程来异步传送日志。 这会使您的主进程成为多线程,在这种情况下,多进程文档建议不要使用默认的fork方法来创建新进程:

叉子

父进程使用os.fork()派生Python解释器。 子进程开始时实际上与 父进程。父级的所有资源均由子级继承 处理。请注意,安全地分叉多线程进程是 有问题的。

仅在Unix上可用。 Unix上的默认设置。

https://docs.python.org/3.4/library/multiprocessing.html?highlight=process#contexts-and-start-methods

在创建新的进程/池之前,请尝试:

multiprocessing.set_start_method('spawn')