从python线程/进程更新全局对象

时间:2016-08-23 11:29:13

标签: python multithreading

我试图从不同的线程访问全局字典。下面是一个完整的例子:

results = {0: 'pass'}

def checkResult(thread_num, result_map):
    while(True):
        results[thread_num] = 'fail'
        print('Thread results : '+str(results))
        time.sleep(5)

multiprocessing.Process(target = checkResult, args=(1, results)).start()
multiprocessing.Process(target = checkResult, args=(2, results)).start()

while(True):
    print('Main results: '+str(results))
    time.sleep(3)

"主要结果"只看到线程0,"线程结果"只根据自己的主题结果修改dict:

Thread results : {0: 'pass', 1: 'fail'}
Main results: {0: 'pass'}
Thread results : {0: 'pass', 2: 'fail'}
Main results: {0: 'pass'}
Thread results : {0: 'pass', 1: 'fail'}
Thread results : {0: 'pass', 2: 'fail'}
Main results: {0: 'pass'}
^C

似乎"结果" map是按值传递而不是按引用传递。有没有办法让线程引用原始的全局映射而不是让每个线程使用它自己的副本?

我知道我应该使用锁定来避免一个线程覆盖另一个线程的更改的问题(我打算在实际的解决方案中这样做)。就目前而言,我只是试图让所有线程都使用通用结果字典。

1 个答案:

答案 0 :(得分:1)

您需要的是对全局对象的并行访问,这可以通过使用线程而不是进程来完成。所有线程共享相同的地址空间,这意味着它们可以访问相同的引用。 (也可以使用列表而不是使用带整数键的dict)

如果你使用独特的“线程数”,你实际上不需要担心竞争条件,因为每个线程都会写入自己的索引。

这样的事情可以解决问题:

import _thread, time

results = {0 : 'pass'}

def checkResult(thread_num):
    while True:
        results[thread_num] = 'fail'
        print('Thread results: ' + str(results))
        time.sleep(3)

_thread.start_new_thread(checkResult, (1,))
_thread.start_new_thread(checkResult, (2,))

while True:
    print('Main results: ' + str(results))
    time.sleep(3)

this可能对您有所帮助)