p1,p2是两个进程
p1.join()
p2.join()
实际效果是p1,p2并发执行,可是应该来说,p1.join()过后,主线程就被阻塞了,就不会执行p2.join(),所以理应p1执行完毕才开始执行p2,为什么会并发呢?
更神奇的是:
p1.join()
print('p1.join()')
p2.join()
print('p2.join()')
输出的居然是:
(p1内输出的内容与
p2内输出的内容交错)
p1.join()
p2.join()
这是为什么呢
p1,p2是两个进程
p1.join()
p2.join()
实际效果是p1,p2并发执行,可是应该来说,p1.join()过后,主线程就被阻塞了,就不会执行p2.join(),所以理应p1执行完毕才开始执行p2,为什么会并发呢?
更神奇的是:
p1.join()
print('p1.join()')
p2.join()
print('p2.join()')
输出的居然是:
(p1内输出的内容与
p2内输出的内容交错)
p1.join()
p2.join()
这是为什么呢
以下回复参考:皆我百晓生、券券喵儿等免费微信小程序作答:
这个问题涉及到 Python 中的多线程和多进程的处理方式以及它们与主线程(或者说主进程)的交互方式。让我们来详细解释一下这个问题。
首先,当我们创建多个进程(如 p1 和 p2)时,这些进程是并发执行的。这意味着它们会同时开始运行,并且操作系统会尽可能地将它们交替地分配给 CPU 以供执行。这是由操作系统管理的,Python 只是作为用户层级的编程语言去创建和调用这些进程。所以即使你在代码中按照顺序写了 p1.join() 和 p2.join(),操作系统仍然可能会交替执行这两个进程。这就是为什么你看到的输出中 p1 和 p2 的输出是交错的。它们是在并发运行的。
接下来是关于 join() 函数的理解。在 Python 中,当我们调用一个进程的 join() 方法时,该主线程(或者你可以称其为主进程)会等待该进程完成执行后才会继续执行后面的代码。这就意味着 p1.join() 会阻塞主线程直到 p1 进程完成执行。但是,这并不会影响到其他进程的并发执行。也就是说,虽然主线程在等待 p1 进程完成,但这并不阻止操作系统调度并执行 p2 进程。因此,即使你在 p1.join() 后面打印了 'p1.join()',这并不会改变 p2 进程的并发执行状态。这就是为什么你看到 p1 和 p2 的输出是交错的,而且 'p1.join()' 和 'p2.join()' 几乎同时打印出来的原因。实际上,'p1.join()' 和 'p2.join()' 的打印可能会根据你的操作系统和 CPU 的调度策略有所不同,有时候 'p1.join()' 会先打印出来,有时候 'p2.join()' 会先打印出来。
总的来说,Python 的多进程处理并不是严格按照我们代码中写的顺序来执行的,而是由操作系统进行调度和管理的。当我们调用 join() 方法时,我们只是让主线程等待该进程完成,但这并不阻止其他进程的并发执行。