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