新线程上相同的套接字速度慢了66%?

时间:2017-10-03 08:15:23

标签: python multithreading performance sockets

这太疯狂了!我听说Python线程很慢,但这是不正常的。

这是伪代码:

class ReadThread:

    v = []
    def __init__(self, threaded = True):
        self.v = MySocket('127.0.0.1')
        if threaded:
            thread.start_new_thread(self._scan, ())

    def read(self):
        t0 = datetime.now()
        self.v.read('SomeVariable')
        t = datetime.now()
        dt = (t-t0).total_seconds()

        print dt

    def _scan(self):
        while True:
            self.read()

如果我在主线程中的while循环中运行read(),如下所示:

r = ReadThread(threaded = False)
while True:
    r.read()

dt约为78 ms,变化很小。现在如果我在这样的新线程中运行它:

r = ReadThread(threaded = True)
while True:
    pass

dt约为130毫秒,差异为+ 10毫秒!

为什么这么慢?我做错了吗?只是在一个新的线程中它是一样的!

MySocket()是一个对象,它使用套接字读取/写入服务器的变量,而read()只是为测试获取一些变量。

1 个答案:

答案 0 :(得分:2)

很难在不知道MySocket是什么的情况下在本地重现这个问题,以及完整的例子。但是,我可以尝试猜测,问题就在于这个循环:

while True:
    pass

非常耗费CPU。 CPU一直在四处走动,将CPU周期带到自身,而不是让套接字工作。

相反,套接字读取操作通常会阻塞和空闲以使数据到达,因此它们几乎不占用CPU。

在第一个示例中,您运行套接字而没有其他任何东西吃CPU。在第二个示例中,主线程完全消耗1个CPU。

尝试用通常的空转操作替换此循环,例如time.sleep(60)。因此,主线程将空闲60秒,而套接字线程将读取和处理数据。

r = ReadThread(threaded = True)
time.sleep(60)
那么在那种情况下测量的是什么呢?