1

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

我怎样才能做到这一点?

4

1 回答 1

2

您可以使用threading 模块thread 模块

这是使用线程模块的示例:

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 模块中找到类似的功能。

这是一个例子:

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列表和字典等复合类型进行资源共享。

于 2013-07-04T21:02:04.453 回答