0

我发现它非常有趣,但不知道为什么:我的一个 python 脚本在 32 位 win 2003 机器上毫不费力地运行(20% 甚至更少的 CPU 使用率),而完全相同的脚本在 64 上几乎花费了 100% 的 CPU位赢2008机器。两台机器具有相同级别的硬件。

基本上,该脚本是多线程的threading,使用mechanize模块从数十个网页中抓取特定结果。

无论如何,在那个 64 位操作系统上 CPU 使用率高的原因是什么?

编辑:

在将多线程脚本从 32 位迁移到 64 位时,我实际上是在尝试寻找一些一般注意事项。

好的,代码如下:

def SpawnThreads(amounts, urls_queue, proxies_queue):

    for counter in range(amounts):
        new_thread = threading.Thread(target = CheckResults, args = (urls_queue, proxies_queue, ))
        new_thread.start()

def CheckResults(urls_queue, proxies_queue):
    if urls_queue.empty():
         return 1

    if proxies_queue.empty():
        return 1

    get url from urls_queue

    get proxy from proxies_queue

    get html source of url

    put proxy back to proxies_queue if everything's all right

    spawn_a_new_thread = threading.Thread(target = SpawnThreads, args = (1, urls_queue, proxies_queue)
    spawn_a_new_thread.start()

if __name__ == "__main__":
    put all urls into urls_queue
    put all proxies into proxies_queue

    SpawnThreads(100, urls_queue, proxies_queue)
4

1 回答 1

1

真正跳出来的一件事是所有这些线程都以循环方式(SpawnThreads-> CheckResults-> SpawnThreads-> ...)产生其他线程。

即使每个线程都应该在它被调用后不久就死掉,但other_thread.start()不断产生的线程很可能会成为瓶颈。

如果我是你,我要做的第一件事就是整理线程逻辑。诸如工作线程池之类的东西可能非常适合该问题。

于 2012-05-04T16:30:48.453 回答