织芜 2024-10-03 22:26 采纳率: 69.2%
浏览 2
已结题

关于python多进程中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()

这是为什么呢

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-10-03 22:27
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    这个问题涉及到 Python 中的多线程和多进程的处理方式以及它们与主线程(或者说主进程)的交互方式。让我们来详细解释一下这个问题。

    首先,当我们创建多个进程(如 p1 和 p2)时,这些进程是并发执行的。这意味着它们会同时开始运行,并且操作系统会尽可能地将它们交替地分配给 CPU 以供执行。这是由操作系统管理的,Python 只是作为用户层级的编程语言去创建和调用这些进程。所以即使你在代码中按照顺序写了 p1.join()p2.join(),操作系统仍然可能会交替执行这两个进程。这就是为什么你看到的输出中 p1p2 的输出是交错的。它们是在并发运行的。

    接下来是关于 join() 函数的理解。在 Python 中,当我们调用一个进程的 join() 方法时,该主线程(或者你可以称其为主进程)会等待该进程完成执行后才会继续执行后面的代码。这就意味着 p1.join() 会阻塞主线程直到 p1 进程完成执行。但是,这并不会影响到其他进程的并发执行。也就是说,虽然主线程在等待 p1 进程完成,但这并不阻止操作系统调度并执行 p2 进程。因此,即使你在 p1.join() 后面打印了 'p1.join()',这并不会改变 p2 进程的并发执行状态。这就是为什么你看到 p1p2 的输出是交错的,而且 'p1.join()''p2.join()' 几乎同时打印出来的原因。实际上,'p1.join()''p2.join()' 的打印可能会根据你的操作系统和 CPU 的调度策略有所不同,有时候 'p1.join()' 会先打印出来,有时候 'p2.join()' 会先打印出来。

    总的来说,Python 的多进程处理并不是严格按照我们代码中写的顺序来执行的,而是由操作系统进行调度和管理的。当我们调用 join() 方法时,我们只是让主线程等待该进程完成,但这并不阻止其他进程的并发执行。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月11日
  • 已采纳回答 10月3日
  • 创建了问题 10月3日