我有一个运行多个线程的 Python (2.7) 应用程序。现在我想在我的子线程中更新一个字典,并在我的母线程中使用它的更新内容,而不使用 join()。我可以这样做吗?我不想等到我的孩子终止在我的母亲线程中使用字典的数据。
我怎样才能做到这一点?
我有一个运行多个线程的 Python (2.7) 应用程序。现在我想在我的子线程中更新一个字典,并在我的母线程中使用它的更新内容,而不使用 join()。我可以这样做吗?我不想等到我的孩子终止在我的母亲线程中使用字典的数据。
我怎样才能做到这一点?
您可以使用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
列表和字典等复合类型进行资源共享。