我有一个Python(2.7)应用程序,我在其中运行多个线程。现在我想更新我的子线程中的字典,并在我的母线程中使用其更新的内容,而不使用join()。我可以这样做吗?我不想等到我的孩子终止在母线中使用字典的数据。
我该怎么做?
答案 0 :(得分:2)
您可以使用threading module或thread 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
允许对列表和词典等复合类型进行资源共享。