[英]how can i improve my multi threading usage to decrease run time, python
cpu_num 8 CPUs
cpu_speed 2826 MHz
mem_total 8173980 KB
swap_total 16777208 KB
当我增加线程数时,性能会有所提高(数字是10次运行的平均值)
Number of Threads Time
1 1.322187
2 0.789151
3 0.72232
5 0.613691
10 0.558912
40 0.531966
在运行代码时从顶部快照
top - 01:40:42 up 7 days, 13:24, 9 users, load average: 0.34, 0.22, 0.27
Tasks: 364 total, 2 running, 362 sleeping, 0 stopped, 0 zombie
Cpu(s): 28.2%us, 0.1%sy, 0.0%ni, 71.5%id, 0.0%wa, 0.1%hi, 0.0%si, 0.0%st
Mem: 8173980k total, 7437664k used, 736316k free, 224748k buffers
Swap: 16777208k total, 149244k used, 16627964k free, 6374428k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20365 ben.long 15 0 723m 208m 4224 S 226.2 2.6 0:37.28 python26
19948 ben.long 15 0 10996 1256 764 R 0.7 0.0 0:03.84 top 4420 ben.long 15 0 106m 3776 1360 R 0.0 0.0 0:03.06 sshd
4421 ben.long 15 0 64320 1628 1180 S 0.0 0.0 0:00.07 bash 4423 ben.long 15 0 64320 1596 1180 S 0.0 0.0 0:00.03 bash
19949 ben.long 15 0 64308 1552 1136 S 0.0 0.0 0:00.01 bash
剥离的代码看起来像
from threading import Thread
class testit(Thread):
def __init__ (self,i):
Thread.__init__(self)
def run(self):
some_task()#do processor heavy task
num_threads_to_use = 10
thread_list = []
for i in range (0,num_threads_to_use):
current = testit(i)
thread_list.append(current)
current.start()
for thread in thread_list:
thread.join()
随着线程数量接近核心数量,性能非线性非线性增长的原因可能在于:
some_task()#do processor heavy task
GIL是围绕I / O繁重的操作发布的; 如果some_task()受CPU限制,那么您当时仅占用一个GIL线程,从而牺牲了线程的优势(并可能在太多上下文切换中浪费时间)。
从http://docs.python.org/c-api/init.html :
Python解释器不是完全线程安全的。 为了支持多线程Python程序,有一个全局锁,称为全局解释器锁或GIL,必须先由当前线程持有,然后才能安全地访问Python对象。 如果没有锁,即使是最简单的操作也可能在多线程程序中引起问题:例如,当两个线程同时增加同一对象的引用计数时,引用计数最终只能增加一次而不是两次。
因此,存在这样的规则,即只有已获得全局解释器锁的线程才可以在Python对象上操作或调用Python / C API函数。 为了支持多线程Python程序,解释器会定期释放并重新获取锁-默认情况下,每100个字节码指令(可以通过sys.setcheckinterval()进行更改)。 锁定也被释放并重新获得,这可能会阻止潜在的阻塞I / O操作(如读取或写入文件),以便在请求I / O的线程正在等待I / O操作完成的同时运行其他线程。
我可能是错的,但是我猜想线程共享相同的GIL,而进程却没有。 请尝试使用多处理模块。
如果您正在执行一些CPU密集型任务,则python中唯一要加快速度的方法是使用多个进程。
其他选择是
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.