测试Python中的因为GIL导致多线程性能测试,pythongil,本程序通过4个例子分析因


本程序通过4个例子分析因为GIL导致了计算密集型和IO密集型的任务的单线程和多线程性能的差异.

#coding:cp936import timeimport getpassimport threadingimport osdef EntryFunction(f):    def _(*args,**tw):        result = f(*args,**tw)        print("=== Process End ===")        getpass.getpass("")        return result    return _()def Stopwatch(f):    def _(*args,**tw):        t1 = time.time()        f(*args,**tw)        t2 = time.time()        return t2-t1    return _class Handler(threading.Thread):    def __init__(self,father):        super(Handler,self).__init__()        self.father = father    def run(self):        return self.father.run()class Compute_ST(object):    """计算密集型单线程"""    def __init__(self,run_time):        self.run_time = run_time    def run(self):        s = 0        for i in range(10000):            s += i        return s    @Stopwatch    def start(self):        for i in range(self.run_time):            self.run()class Compute_MT(object):    """计算密集型多线程"""    def __init__(self,run_time):        self.threads = [Handler(self) for i in range(0,run_time)]        self.runing_thread = 0    def run(self):        self.runing_thread += 1        s = 0        for i in range(10000):            s += i        self.runing_thread -= 1        return s    @Stopwatch    def start(self):        for t in self.threads:            t.start()        while self.runing_thread > 0:            passclass IO_ST(Compute_ST):    """IO密集型单线程"""    def run(self):        r = os.popen("ping 127.0.0.1")        return r.read()class IO_MT(Compute_MT):    """IO密集型多线程"""    def run(self):        self.runing_thread += 1        r = os.popen("ping 127.0.0.1")        t = r.read()        self.runing_thread -= 1        return t@EntryFunctiondef main():    n = 100    test = Compute_ST(n)    print(test.__doc__)    t = test.start()    print(t)    test = Compute_MT(n)    print(test.__doc__)    t = test.start()    print(t)    n = 10    test = IO_ST(n)    print(test.__doc__)    t = test.start()    print(t)    test = IO_MT(n)    print(test.__doc__)    t = test.start()    print(t)#该片段来自于http://byrx.net

评论关闭