Python线程问题

时间:2013-06-08 22:21:00

标签: 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]

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

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))

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

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

如果您认为我应该使用其他语言,如果您能指出,我会很高兴。 帮助将是ayciated。提前谢谢。

2 个答案:

答案 0 :(得分:9)

Python中的传统线程(http://docs.python.org/2/library/threading.html)在大多数常见运行时受到"Global Interpreter Lock" (GIL)的限制,这可以防止多个线程同时执行,无论您拥有多少内核或CPU。尽管存在这种限制,但传统线程在线程受I / O限制时仍然非常有价值,例如处理网络连接或执行数据库查询,其中大多数时候它们都在等待外部事件而不是“计算”。

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

  

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

答案 1 :(得分:0)

你的第二个代码什么都不做,因为测试的返回值被丢弃了。你的意思是保留print d[j]吗?

除非test(i, j)实际上比你实现的更复杂,否则你绝对不会优化任何东西,因为启动一个线程所需的时间比访问一个字典要长。你可能会做得更好:

def test(i):
    for j in l2:
        if d[j] == i:
            print d[j]

for i in l1:
    threading.start_new_thread(test, (i,))

通常,一些线程可以提高性能,数百个线程只会增加开销。

全局解释器锁不一定使线程无法提高Python的性能。许多标准库函数将在完成繁重工作时释放全局解释器锁。对于这个简单的例子,可能没有并行性。