Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当多个子进程使用“concurrent.futures.ProcessPoolExecutor”访问时,“queue.queue”是线程安全的吗?_Python_Python 3.x_Multithreading - Fatal编程技术网

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文档。