Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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 子流程的执行顺序和it';s对操作原子性的影响_Python_Multithreading_Multiprocessing_Python Multiprocessing - Fatal编程技术网

Python 子流程的执行顺序和it';s对操作原子性的影响

Python 子流程的执行顺序和it';s对操作原子性的影响,python,multithreading,multiprocessing,python-multiprocessing,Python,Multithreading,Multiprocessing,Python Multiprocessing,我正在学习python多处理模块,并找到了示例(这是一个稍加修改的版本): 其输出如下: (3, 'amF') (1, 'c') (6, '714CUg') (4, '10Qg') (5, 'Yns6h') (7, 'wsSXj3Z') (9, 'KRcDTtVZA') (2, 'Qy') (8, '50LpMzG9') [(3, 'amF'), (1, 'c'), (6, '714CUg'), (4, '10Qg'), (5, 'Yns6h'), (9, 'KRcDTtVZA'), (2, '

我正在学习python多处理模块,并找到了示例(这是一个稍加修改的版本):

其输出如下:

(3, 'amF')
(1, 'c')
(6, '714CUg')
(4, '10Qg')
(5, 'Yns6h')
(7, 'wsSXj3Z')
(9, 'KRcDTtVZA')
(2, 'Qy')
(8, '50LpMzG9')
[(3, 'amF'), (1, 'c'), (6, '714CUg'), (4, '10Qg'), (5, 'Yns6h'), (9, 'KRcDTtVZA'), (2, 'Qy'), (7, 'wsSXj3Z'), (8, '50LpMzG9')]
我知道进程并不是按照它们创建的顺序被调用的(使用
processs=[mp.Process(target=rand\u string,args=(x,output)),对于范围(1,10)]
),这在参考文章中提到过。我不明白的是(或者我不确定理解是否正确)为什么
结果的顺序与print将
结果输出到STDOUT的顺序不一致?我对这一点的理解是,这三个操作不是原子的(我的意思是它们可以通过进程切换来分隔):

基本上,这里发生的情况是,当进程
打印
结果
到标准输出时,它会切换到另一个进程,写入
结果
。诸如此类:

Time 
------------------------------------------------------------------------------------------------------------------>
Process1: print results |               |                                    | time.sleep(1) | output.put(result) |
Process2:               | print results | time.sleep(1) | output.put(result) |               |                    |
在这种情况下,STDOUT上的输出为:

(1, 'c')
(2, 's5')
但是
结果的实际内容将是:

[(2,'s5')(1,'c')]

出于同样的原因,这些过程在创建时没有按顺序启动

我说得对吗?

是的,你说得对——进程不会在锁定步骤中执行。现代操作系统使用复杂的算法来决定何时从一个进程切换到另一个进程,但这些算法并不向任何进程提供任何形式的保证,说明它与具有相同优先级的另一个进程相比将如何进展(通常只对具有不同优先级的进程提供有限的保证)

通常,进程在等待操作系统或当前时间片(基于硬件时钟中断)过期时被阻塞。这些事件周期性地发生,但前台任务在一次勾选期间接收的时间量会根据后台发生的情况以及进程的确切切换时间(可能是因为另一个进程因I/O阻塞而被切换)


如果使用不同的系统加载重新运行测试,很可能会得到不同的结果。(每个过程需要做的工作越多,也越有可能看到不同的结果。)

你是对的。操作系统可以并且将执行上下文切换,但是,只要它愿意这样做。Python解释器(或即时编译器或其他什么)是一个程序,因此完全由内核控制

因此,这种“内核/用户奴役”是“从父到子”传递的,或者换句话说,Python程序在解释器的merced中,而解释器又在内核的merced中

因此,用户空间程序(如Python应用程序)确保同步的唯一方法是使用锁定原语,如es或其他


现在,在现实世界中,通常是什么导致写入文件时发生上下文切换(如stdout,默认情况下由
print
完成),需要执行许多昂贵的操作,如复杂的内存重新映射和黑魔法ies,以及环回机制(例如,
stdout
指的是a,这是当今最常见的情况)。

你是对的,没有秩序或原子性的保证。那么问题是什么?问题是:),我不确定我是否理解正确。
Time 
------------------------------------------------------------------------------------------------------------------>
Process1: print results |               |                                    | time.sleep(1) | output.put(result) |
Process2:               | print results | time.sleep(1) | output.put(result) |               |                    |
(1, 'c')
(2, 's5')