32

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

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

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

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

编辑:

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

编辑2:

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

nice -n 19 python MyScript.py
4

5 回答 5

27

我相信线程优先级在 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

于 2012-07-10T21:18:02.370 回答
7

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

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

即使使用 os.sched_yield() 的自由洒,子线程实际上也不会超过 setpriority()。

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

于 2018-08-22T16:40:10.530 回答
7

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

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

于 2018-08-23T15:22:40.387 回答
4

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

看一下threading2,它是默认线程模块替代和扩展,支持 - 有点 - 优先级和亲和性。

于 2015-06-20T12:13:46.087 回答
1

我想知道另一个相关问题的答案在这种情况下是否有用?(链接

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

于 2012-08-08T22:59:45.063 回答