【问题标题】:Controlling scheduling priority of python threads?控制python线程的调度优先级?
【发布时间】:2012-07-10 10:07:08
【问题描述】:

我编写了一个脚本,它使用两个线程池(每个线程池有 10 个线程)从 API 中提取数据。线程池实现this code on ActiveState。每个线程池都通过PubSub 监视 Redis 数据库中的新条目。当发布新条目时,python 将数据传递给一个函数,该函数使用 python 的 Subprocess.POpen 执行 PHP shell 来执行调用 API 的实际工作。

这个启动 PHP shell 的系统对于我的 PHP Web 应用程序的功能是必要的,因此无法避免使用 Python 启动 PHP shell。

此脚本将仅在 Linux 服务器上运行。

如何控制应用线程的niceness(调度优先级)?

编辑:

在 Python 中控制单个线程的调度优先级似乎是不可能的。是否有 python 解决方案,或者至少可以与脚本一起运行的 UNIX 命令来控制优先级?

编辑 2:

好吧,我最终没有找到处理它的 python 方法。我现在就像这样运行我的脚本:

nice -n 19 python MyScript.py

【问题讨论】:

    标签: python multithreading threadpool scheduling nice


    【解决方案1】:

    我相信线程优先级在 python 中是不可控的,因为它们是如何使用全局解释器锁 (GIL) 实现的。话虽如此,即使您可以给一个线程更多的 CPU 处理优先级,传递 GIL 的 python 实现在传递 GIL 时也不会意识到这一点。如果您能够提高池中单个线程的友好度(比如说它正在做一项更重要的工作),您将需要使用您自己的锁实现来让更高优先级的线程更频繁地访问 GIL。

    谷歌搜索返回这篇文章,我认为它与您的要求相似

    解释为什么它不起作用 http://www.velocityreviews.com/forums/t329441-threading-priority.html

    解释我建议的解决方法 http://bytes.com/topic/python/answers/645966-setting-thread-priorities

    【讨论】:

    • 感谢您的回答!我现在改写了这个问题,询问我如何为整个应用程序而不是个人设置计划优先级。那应该仍然可以满足我的需求。我已对您的回复投了赞成票,如果没有其他回复,我会选择您作为最佳答案。
    【解决方案2】:

    python threading-docs 明确提到不支持设置线程优先级:

    这个模块的设计松散地基于 Java 的线程模型。然而,Java 使锁和条件变量成为每个对象的基本行为,它们在 Python 中是独立的对象。 Python 的 Thread 类支持 Java 的 Thread 类行为的一个子集; 目前没有优先级,没有线程组,线程不能被销毁、停止、暂停、恢复或中断。 Java Thread 类的静态方法在实现时会映射到模块级函数。

    【讨论】:

      【解决方案3】:

      它不起作用,但我尝试了:

      1. 获取父 pid 和优先级
      2. 使用 concurrent.futures.ThreadPoolExecutor 启动线程
      3. 使用 ctypes 从线程(works) 中获取 (linux) 线程 ID
      4. 将 tid 与 os.setpriority(os.PRIO_PROCESS,tid,parent_priority+1) 一起使用
      5. 从父级调用 pool.shutdown()。

      即使大量使用 os.sched_yield(),子线程实际上也不会超过 setpriority()。

      阅读手册页,似乎线程没有能力改变(甚至他们的)调度优先级;您必须使用“功能”来为线程提供“CAP_SYS_NICE”功能。以 root 权限运行该进程也无济于事。子线程仍然没有运行。

      【讨论】:

        【解决方案4】:

        我知道,已经过去了很长时间,但我最近遇到了这个问题,我认为添加另一个选项会很有用。

        看看threading2,它是默认threading模块的drop-in替换和扩展,支持 - 有点 - 优先级和亲和力。

        【讨论】:

        【解决方案5】:

        我想知道this answer at another related question 在这种情况下是否有用? (link)

        由于您已经在使用Subprocess.POpen 来启动您的 PHP 脚本,我觉得您可以使用“preexec_fn”以及预定义函数或 lambda 函数(如上面链接的答案所示) 设置每个启动的 PHP 线程的 nice 级别?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-06-29
          • 1970-01-01
          • 2011-06-25
          • 1970-01-01
          • 1970-01-01
          • 2011-06-22
          • 1970-01-01
          相关资源
          最近更新 更多