|
|
1
9
另一个解决办法是: http://docs.python.org/library/multiprocessing.html 注1:这是 Python语言的局限性,但CPython实现的局限性。 注2:关于亲和性,您的操作系统本身应该没有问题。 |
|
|
2
7
我从未听说有人使用taskset来提高Python的性能。这并不意味着在你的案例中不可能发生,但一定要公布你的结果,这样其他人就可以批评你的基准测试方法并提供验证。 但就我个人而言,我会使用消息队列将I/O线程与CPU绑定线程分离。这样,您的前端现在完全是网络I/O绑定的(一些具有HTTP接口,一些具有消息队列接口),非常适合您的线程情况。然后,CPU密集型进程可以使用多处理,也可以是等待工作到达消息队列的单个进程。 eventlets 因为,即使它们对性能没有帮助,它们也应该提高可伸缩性。您的后端现在已经可以扩展,因为您可以根据需要在任意数量的机器+CPU上运行消息队列。 |
|
|
3
3
|
|
|
4
1
多年来,我发现以下经验法则已经足够了:如果工作线程依赖于某个共享状态,那么我会为每个核心使用一个多处理进程(CPU绑定),为每个核心使用一个固定的工作线程池(I/O绑定)。操作系统将负责将不同的Python进程分配给内核。 |
|
|
5
1
Python GIL是每个Python解释器的。这意味着,在进行多处理时,避免出现问题的唯一方法是启动多个解释器(即使用单独的进程而不是线程进行并发),然后使用其他IPC原语在进程之间进行通信(如套接字)。也就是说,当使用线程阻止I/O调用时,GIL不是问题。 前面提到的GIL的主要问题是不能同时执行两个不同的python代码线程。阻塞I/O调用上的线程阻塞被阻塞,因此不会执行python代码。这意味着它没有阻塞GIL。如果在单独的python线程中有两个CPU密集型任务,那么GIL将终止python中的多处理(如前所述,只有CPython实现)。因为GIL阻止CPU#1执行一个python线程,而CPU#0正忙于执行另一个python线程。 |
|
|
6
1
在GIL从Python中删除之前,可以使用co例程代替线程。据我所知,这一战略已经由两家成功的初创公司实施,至少在一个案例中使用了Greenlet。 |
|
|
7
0
您可以使用多处理模块,它不是为每个任务创建线程,而是创建另一个cpython compier进程来解释您的代码。 这将使您的应用程序能够利用多核系统。 我在这种方法中看到的唯一问题是,通过在内存上创建一个完整的新进程堆栈,您将有相当大的开销。( http://en.wikipedia.org/wiki/Thread_(computing)#How_threads_differ_from_processes ) Python多处理模块: http://docs.python.org/dev/library/multiprocessing.html “我不使用多处理模块的原因是(在本例中)程序的一部分受到严重的网络I/O限制(HTTP请求),因此拥有一个工作线程池是一个很好的方法来压缩性能…” 关于这一点,我想你也可以有一个流程池: http://docs.python.org/dev/library/multiprocessing.html#using-a-pool-of-workers 狮子座 |