【问题标题】:Django/Python: How do you start a new process in Python?Django/Python:如何在 Python 中启动一个新进程?
【发布时间】:2010-01-20 19:21:39
【问题描述】:

客户上传图像后,我想将图像重新调整为 8 种不同的尺寸,然后将它们发送到 S3 并将它们保存到文件系统中。显然这可能需要很长时间(几秒钟),我想以“多线程”的方式来做(我引用它是因为我不在乎它实际上是多线程的还是其他一些功能)。我的理解是,由于 Python 中的 GIL,您无法成功地将多线程用于此类事情,因为它使用相同的进程,因此与您在代码的正常流程(与多线程)中执行此操作完全相同。是否有其他更好的方法可以在 Python 中为此类任务打开一个新进程?

【问题讨论】:

  • 这些帖子没有帮助。大多数答案都提到使用子进程,除了使您的代码复杂化之外,它对任何人都没有任何用处(除非您有可以通过子进程解决的大型 IO 问题)。谷歌“Python GIL 的问题”。
  • “对任何人都没有任何用处的子进程”。然而,您接受了“子流程”的答案。我没有得到与接受的答案混合的评论。

标签: python django multithreading


【解决方案1】:

如果要调用外部进程,请使用subprocess 模块。

另一方面,如果您想避开 GIL 并执行一些 Python 任务,请使用 multiprocessing 模块。它提供了一个与threading 包非常相似的接口,但使用了子进程,因此您不受 GIL 的约束。

【讨论】:

  • 使用子进程的原因是什么(即,什么是外部进程)?
  • @orokusaki:假设您想使用一些外部实用程序处理某个文件,例如,您正在处理视频并且您希望 ffmpeg 为您转码:在这种情况下,您将使用 subprocess 模块启动 ffmpeg,将您的输入数据通过管道传输到它并读取它的输出以获取处理后的数据。但是,如果您想要运行一些长时间运行的 Python 例程而不受 GIL 的影响,那么 multiprocessing 包就是您想要的。
猜你喜欢
  • 2021-11-27
  • 1970-01-01
  • 2012-02-27
  • 2016-01-14
  • 2019-01-03
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多