在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()