Python 当多个子进程使用“concurrent.futures.ProcessPoolExecutor”访问时,“queue.queue”是线程安全的吗?
在执行多个线程的情况下,我一直广泛使用Python 当多个子进程使用“concurrent.futures.ProcessPoolExecutor”访问时,“queue.queue”是线程安全的吗?,python,python-3.x,multithreading,Python,Python 3.x,Multithreading,在执行多个线程的情况下,我一直广泛使用queue.queue,例如使用concurrent.futures.ThreadPoolExecutor 我从博客上读到,queue.queue应该是线程安全的,但这是否意味着在Python解释器一次只执行一个线程的假设下它是线程安全的(GIL),或者在使用多处理的情况下它也是线程安全的,哪一方通过使用子进程而不是线程来步进GIL 在多处理库中为此开发了一个队列 来自多处理导入队列的 这使用套接字发送线程安全的字节数据。在多处理库中为此开发了一个队列 来
queue.queue
,例如使用concurrent.futures.ThreadPoolExecutor
我从博客上读到,queue.queue
应该是线程安全的,但这是否意味着在Python解释器一次只执行一个线程的假设下它是线程安全的(GIL),或者在使用多处理的情况下它也是线程安全的,哪一方通过使用子进程而不是线程来步进GIL
在多处理
库中为此开发了一个队列
来自多处理导入队列的
这使用套接字发送线程安全的字节数据。在多处理
库中为此开发了一个队列
来自多处理导入队列的
这使用套接字发送线程安全的字节数据。使用multiprocessing.queues.Queue作为,使用mp_context.SimpleQueue(多处理)作为-用于本地线程和进程之间的通信
- ProcessPoolExecutor stuff使用多处理队列在线程和进程之间进行通信
- multiprocessing.queues.Queue文档特别声明它是线程和进程安全的
- 在的底部有一个注释,它指向multiprocessing.Queue对象
。。。用于多处理(而非多线程)环境
对使用multiprocessing.queues.Queue,对-使用mp_context.SimpleQueue(多处理),用于本地线程和进程之间的通信
- ProcessPoolExecutor stuff使用多处理队列在线程和进程之间进行通信
- multiprocessing.queues.Queue文档特别声明它是线程和进程安全的
- 在的底部有一个注释,它指向multiprocessing.Queue对象
。。。用于多处理(而非多线程)环境
所以,为了完全回答我的问题,queue.queue
只有在被多个线程(关于GIL)访问时才是线程安全的,而不是被多个进程(单步GIL)访问时才是线程安全的?为什么套接字是线程安全的?我很确定这不是线程安全的问题,而是queue.queue
在不同进程之间根本不起作用,而multiprocessing.queue
会起作用。所以,完全回答我的问题,queue.queue
只有在被多个线程访问时才是线程安全的(关于GIL),不是通过多个过程(单步GIL)?为什么套接字是线程安全的?我很确定这不是线程安全的问题,而是queue.queue
在不同进程之间根本不起作用,而multiprocessing.Queue
会。这是否意味着我可以将ThreadPoolExecutor/Queue.Queue
的组合替换为ProcessPoolExecutor/multiprocessing.queues.Queue
,一切都会正常工作?你为什么要谈论呼叫队列和结果队列?我只想要生产者/消费者模式的队列。@我试图通过引用源代码指出concurrent.futures.ProcessPoolExecutor使用multiprocessing.queues.queue-这意味着这是有原因的,我想象你会通过源代码了解它们是如何做到的。。我在我的答案中添加了一点-如果您认为我的答案有缺陷,请告诉我,我将删除它。这是否意味着我可以根据我的经验替换…
。是的。您在哪里看到。。用于多处理…
注意?我在这里找不到:。另外,您知道Python是如何创建子流程的吗?整个解释器是分叉的,还是在新的子进程中如何执行可调用的?@Shuzheng Sorry-添加了一个链接。我在参考标准库中queue
模块的Python文档。这是否意味着我可以将ThreadPoolExecutor/queue.queue
组合替换为ProcessPoolExecutor/multiprocessing.queues.queue
,然后一切都可以正常工作?你为什么要谈论呼叫队列和结果队列?我只想要生产者/消费者模式的队列。@我试图通过引用源代码指出concurrent.futures.ProcessPoolExecutor使用multiprocessing.queues.queue-这意味着这是有原因的,我想象你会通过源代码了解它们是如何做到的。。我在我的答案中添加了一点-如果您认为我的答案有缺陷,请告诉我,我将删除它。这是否意味着我可以根据我的经验替换…
。是的。您在哪里看到。。用于多处理…
注意?我在这里找不到:。另外,您知道Python是如何创建子流程的吗?整个解释器是分叉的,还是在新的子进程中如何执行可调用的?@Shuzheng Sorry-添加了一个链接。我指的是标准库中队列
模块的Python文档。