Python线程问题

use*_*813 3 python multithreading

我有以下内容:

d = {...} #a dictionary with strings
l1 = [...] #a list with stuff
l2 = [...] #a list with numbers

...

for i in l1:
    for key in l2:
        #do some stuff
        ...
        if d[key] == i:
            print d[key]
Run Code Online (Sandbox Code Playgroud)

我想使用线程(为了提高性能)做同样的事情.我想的是:

import threading

d = {...} #a dictionary with strings
l1 = [...] #a list with stuff
l2 = [...] #a list with numbers

...

def test(i, key):
    #do the same stuff
    if d[key] == i:
        print d[j]

for i in l1:
    for key in l2:
        threading.start_new_thread(test, (i,key))
Run Code Online (Sandbox Code Playgroud)

我不确定这是最好的方法.我担心的是,我根本没有优化.一些基本想法是:

  • d应该在共享内存中(所有线程都可以访问它).我假设没有线程会访问相同的条目.
  • 应该同时测试每个(i,key)组合.

如果你认为我应该使用另一种语言,如果你能指出它我会很高兴.帮助将是ayciated.提前致谢.

dka*_*ins 9

Python中的传统线程(http://docs.python.org/2/library/threading.html)在大多数常见的运行时中受到"全局解释器锁定"(GIL)的限制,它可以防止多个线程同时执行,无论如何你有很多核心或CPU.尽管存在这种限制,但是当线程受I/O限制时,传统线程仍然非常有价值,例如处理网络连接或执行数据库查询,其中大多数情况下它们都在等待外部事件而不是"计算".

如果您的个别进程受CPU限制,例如您的问题所暗示的,那么您将更好地使用较新的"多处理"模块(http://docs.python.org/2/library/multiprocessing.html):

multiprocessing是一个使用类似于线程模块的API支持产生进程的包.多处理包提供本地和远程并发,通过使用子进程而不是线程有效地侧向执行全局解释器锁.因此,多处理模块允许程序员充分利用给定机器上的多个处理器.

  • 很好的答案.在谈论Python时,我经常看到人们说'不要费心使用线程',但正如你正确地指出I/O绑定操作一样,它仍然可以产生良好的性能优势. (3认同)