在多个活动线程之间共享字典

时间:2013-07-04 20:18:32

标签: python python-2.7 dictionary multiprocessing

我有一个Python(2.7)应用程序,我在其中运行多个线程。现在我想更新我的子线程中的字典,并在我的母线程中使用其更新的内容,而不使用join()。我可以这样做吗?我不想等到我的孩子终止在母线中使用字典的数据。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

您可以使用threading modulethread module

以下是使用线程模块的示例:

import thread

d = dict()
m = thread.allocate_lock()

def foo():
    m.acquire_lock()
    print(d['key'])

def bar():
    d['key'] = 'value'
    m.release_lock()

if __name__ == '__main__':

    m.acquire_lock()
    t1 = thread.start_new_thread(foo,())
    t2 = thread.start_new_thread(bar,())

这说明了锁如何同步对共享资源的线程访问:只要m被锁定,foo正在等待获取它;同时,bar更新字典并释放锁;只有这样foo才能获得锁定并继续。没有加入。

(当然,这不是你应该如何编写多线程代码......)

修改

如果您必须使用流程,则可以在multiprocessing module中找到类似的功能。

以下是一个例子:

import multiprocessing

def foo(m, d):
    m.acquire()
    print(d['key'])

def bar(m, d):
    d['key'] = 'value'
    m.release()

if __name__ == '__main__':

    manager = multiprocessing.Manager()

    m = multiprocessing.Lock()
    m.acquire()

    d = manager.dict()

    p1 = multiprocessing.Process(target=foo, args=(m, d))
    p2 = multiprocessing.Process(target=bar, args=(m, d))

    p1.start()
    p2.start()

Lock允许进程同步,Manager允许对列表和词典等复合类型进行资源共享。