在python中,有没有一种方法可以跨线程添加到变量中

在python中,有没有一种方法可以跨线程添加到变量中,python,multithreading,variables,python-2.7,Python,Multithreading,Variables,Python 2.7,有没有一种方法可以让一个变量跨活动线程运行,如下所示 count = 0 threadA(count) threadB(count) threadA(count): #do stuff count += 1 threadB(count): #do stuff print count 那么这个计数会打印出1?我更改了线程A中的变量,它反映到另一个线程?您的变量count已可用于所有线程。但是您需要同步对它的访问,否则您将丢失更新。研究使用锁来保护对计数的访问。如

有没有一种方法可以让一个变量跨活动线程运行,如下所示

count = 0
threadA(count)
threadB(count)

threadA(count):
    #do stuff
    count += 1
threadB(count):
    #do stuff
    print count

那么这个计数会打印出1?我更改了线程A中的变量,它反映到另一个线程?

您的变量
count
已可用于所有线程。但是您需要同步对它的访问,否则您将丢失更新。研究使用锁来保护对计数的访问。

如果要使用进程而不是线程,请使用
多处理。它有更多的功能,包括一个
管理器
对象,为您处理共享对象。作为一项额外福利,您可以跨机器共享对象

来源
好的,谢谢你,我只是在读关于线程模块的多线程处理的书,所以我会记住这一点。为了简洁起见,我假设你忽略了实际的线程创建,但这里最大的问题似乎是你用函数的一个参数隐藏了全局变量。也就是说,threadA修改它的参数,而不是全局参数。嗯,是的,就是这样。因此,如果我不将count作为参数传入,那么当我将1添加到thread中时,count将是1,然后当它在threadB内部打印时,它将打印1?然而,如果我在范围中传递它,那么只改变线程?
import multiprocessing, signal, time

def producer(objlist):
    '''
    add an item to list every sec
    '''
    while True:
        try:
            time.sleep(1)
        except KeyboardInterrupt:
            return
        msg = 'ding: {:04d}'.format(int(time.time()) % 10000)
        objlist.append( msg )
        print msg


def scanner(objlist):
    '''
    every now and then, consume objlist & run calculation
    '''
    while True:
        try:
            time.sleep(3)
        except KeyboardInterrupt:
            return
        print 'items: {}'.format( list(objlist) )
        objlist[:] = []


def main():

    # create obj sharable between all processes
    manager = multiprocessing.Manager()
    my_objlist = manager.list() # pylint: disable=E1101

    multiprocessing.Process(
        target=producer, args=(my_objlist,),
    ).start()

    multiprocessing.Process(
        target=scanner, args=(my_objlist,),
    ).start()

    # kill everything after a few seconds
    signal.signal(
        signal.SIGALRM, 
        lambda _sig,_frame: manager.shutdown(),
        )
    signal.alarm(12)

    try:
        manager.join() # wait until both workers die
    except KeyboardInterrupt:
        pass


if __name__=='__main__':
    main()