【发布时间】:2018-04-23 10:02:48
【问题描述】:
我尝试使用 ProcessPoolExecutor 组合阻塞任务和非阻塞(I/O 绑定)任务,发现它的行为非常出乎意料。
class BlockingQueueListener(BaseBlockingListener):
def run(self):
# Continioulsy listening a queue
blocking_listen()
class NonBlockingListener(BaseNonBlocking):
def non_blocking_listen(self):
while True:
await self.get_message()
def run(blocking):
blocking.run()
if __name__ == "__main__":
loop = asyncio.get_event_loop()
executor = ProcessPoolExecutor()
blocking = BlockingQueueListener()
non_blocking = NonBlockingListener()
future = loop.run_in_executor(executor, run(blocking))
loop.run_until_complete(
asyncio.gather(
non_blocking.main(),
future
)
)
我原以为这两个任务将同时拥有控制权,但阻塞任务在 ProcessPoolExecutor 块中开始并且永远不会返回控制权。怎么会发生?在多处理执行器中开始结合普通协程和期货的正确方法是什么?
【问题讨论】:
标签: python concurrency multiprocessing