List 为什么在子流程中对列表所做的更改没有显示在父流程中?
我正在创建一个子进程来读取不断增长的日志文件。我将一个计数器(在列表中)传递到List 为什么在子流程中对列表所做的更改没有显示在父流程中?,list,python-2.7,multiprocessing,List,Python 2.7,Multiprocessing,我正在创建一个子进程来读取不断增长的日志文件。我将一个计数器(在列表中)传递到log\u file\u reader函数中,如果行有效,则在计数器列表中附加1。我每5秒检查一次主进程中的计数器。中的计数器在子进程中按预期增加,但在主进程中始终为0。我检查了柜台的id;它在子过程和主过程中都是相同的。为什么主流程中的计数器没有增加?如果我将计数器更改为counter=multiprocessing.Queue(),并检查log\u file\u reader(…)中的qsize()或主线程,则一切
log\u file\u reader
函数中,如果行有效,则在计数器列表中附加1。我每5秒检查一次主进程中的计数器。中的计数器在子进程中按预期增加,但在主进程中始终为0。我检查了柜台的id;它在子过程和主过程中都是相同的。为什么主流程中的计数器没有增加?如果我将计数器更改为counter=multiprocessing.Queue()
,并检查log\u file\u reader(…)
中的qsize()
或主线程,则一切正常
import subprocess
import select
import multiprocessing
import time
def log_file_reader(filename, counter):
f = subprocess.Popen(['tail', '-F',filename], stdout=subprocess.PIPE,stderr=subprocess.PIPE)
p = select.poll()
p.register(f.stdout)
while True:
if p.poll(1):
line = f.stdout.readline().strip()
if line:
'''appends 1 to counter if line is valid'''
counter.append(1)
def main():
counter = list() # initializes a counter in type list
# starts up a process keep tailing file
reader_process = multiprocessing.Process(target=log_file_reader, args=("/home/haifzhan/logfile.log", counter))
reader_process.start()
# main thread check the counter every 5 seconds
while True:
time.sleep(5)
print "periodically check---counter:{0},id:{1}".format(len(counter), id(counter))
if __name__ == "__main__":
# everything starts here
main()
普通
列表
对象不在进程之间共享,因此子进程中的计数器
实际上是与父进程中的计数器
完全不同的对象。对其中一个所做的更改不会影响另一个。如果要在进程之间共享列表,需要使用:
但是,如果您只是将列表用作计数器,那么您也可以使用,而不是列表,它实际上是用于计数目的,并且不需要启动管理器
过程:
import subprocess
import select
import multiprocessing
import time
def log_file_reader(filename, counter):
f = subprocess.Popen(['tail', '-F',filename], stdout=subprocess.PIPE,stderr=subprocess.PIPE)
p = select.poll()
p.register(f.stdout)
while True:
if p.poll(1):
line = f.stdout.readline().strip()
if line:
'''appends 1 to counter if line is valid'''
with counter.get_lock():
counter.value += 1
def main():
m = multiprocessing.Manager()
counter = multiprocessing.Value('i', 0) # A process-safe int, initialized to 0
# starts up a process keep tailing file
reader_process = multiprocessing.Process(target=log_file_reader, args=("/home/haifzhan/logfile.log", counter))
reader_process.start()
# main thread check the counter every 5 seconds
while True:
time.sleep(5)
with counter.get_lock():
print "periodically check---counter:{0},id:{1}".format(counter.value, id(counter))
是什么阻止您使用
counter=multiprocessing.Queue()
非常感谢!我发现列表不适用于进程间!我从未使用过multiprocessing.Manager().list
和multiprocessing.Value
,它们非常有用!
import subprocess
import select
import multiprocessing
import time
def log_file_reader(filename, counter):
f = subprocess.Popen(['tail', '-F',filename], stdout=subprocess.PIPE,stderr=subprocess.PIPE)
p = select.poll()
p.register(f.stdout)
while True:
if p.poll(1):
line = f.stdout.readline().strip()
if line:
'''appends 1 to counter if line is valid'''
with counter.get_lock():
counter.value += 1
def main():
m = multiprocessing.Manager()
counter = multiprocessing.Value('i', 0) # A process-safe int, initialized to 0
# starts up a process keep tailing file
reader_process = multiprocessing.Process(target=log_file_reader, args=("/home/haifzhan/logfile.log", counter))
reader_process.start()
# main thread check the counter every 5 seconds
while True:
time.sleep(5)
with counter.get_lock():
print "periodically check---counter:{0},id:{1}".format(counter.value, id(counter))