>  기사  >  백엔드 개발  >  컨텍스트 관리자 및 데몬 스레드

컨텍스트 관리자 및 데몬 스레드

WBOY
WBOY앞으로
2024-02-06 11:27:08950검색

컨텍스트 관리자 및 데몬 스레드

질문 내용

초마다 하트비트를 보내도록 되어 있는 컨텍스트 관리자에서 데몬 스레드를 시작하고 있지만 스레드에서 실행 중이기 때문에 예외가 발생하면 컨텍스트 관리자를 종료하지 않습니다. 하트비트가 멈췄을 때 컨텍스트 관리자에서 예외를 발생시키는 방법은 무엇입니까?

으아악

이에 대한 예를 찾는 데 문제가 있습니다.

도와주셔서 감사합니다!


정답


업데이트

게시하신 코드와 좀 더 일관성을 갖도록 코드를 수정했습니다. 하지만:

제공하신 코드가 일치하지 않습니다. heartbeat_task 传递了一个事件,如果设置该事件将导致函数返回。但只有当使用 with plc(): 创建的函数 main 中的上下文管理器退出时才会设置它,而这是永远不会的。如果您希望 heartbeat_task 抛出的任何异常将强制上下文管理器退出,然后在函数 plc 中捕获,那么调用 stop_event.set() 的意义何在?如果根据定义,我们仅在 heartbeat_task 예외로 인해 코드가 더 이상 존재하지 않는 경우에만 여기에 오셨나요?

그래서 당신은 heartbeat_task 无限期地运行,直到引发异常(在这种情况下,没有“停止”事件的意义),要么您希望能够在存在某些条件时停止 heartbeat_task,但没有这样做的代码。出于演示目的,我假设 main 将有权访问 stop_event 事件,并在某些情况下对其进行设置。否则,它会一直运行,直到检测到 heartbeat_task 다시는 실행하지 않기를 원합니다. 아마도 예외가 발생했기 때문일 것입니다(무한 루프를 실행하고 있는데 중지 이벤트가 아직 설정되지 않은 경우 어떻게 종료될 수 있습니까?). 나머지는 컨텍스트 관리자를 사용해야 하는 이유입니다. 나중에 대안을 제안하겠습니다.

멀티 스레드 풀을 사용하는 경우(풀에 하나의 스레드만 필요함) 풀에 제출된 작업에 의해 발생한 예외를 메인 스레드가 포착하는 것이 간단해집니다. multiprocessing.pool.threadpool.apply_async 被调用时返回 multiprocessing.pool.asyncresult 实例,表示未来的完成。当在此实例上调用 get 方法时,您可以从辅助函数 (heartbeat_task) 获取返回值,或者重新引发辅助函数引发的任何异常。但是我们也可以使用 wait 方法来等待提交任务的完成或经过的时间。然后我们可以使用 ready 메소드가 작업 제출 여부를 테스트할 때 5초 정도 기다리면 실제로 완료됩니다(예외 또는 반환으로 인해). 작업이 여전히 실행 중이면 중지하라고 지시할 수 있습니다. 이 데모에서는 약 7초 후에 작업이 예외를 발생시키도록 강제합니다.

으아악

인쇄:

으아악

컨텍스트 관리자 사용의 대안

으아악

위 내용은 컨텍스트 관리자 및 데몬 스레드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제