收听列表​​并在附加时做某事

我有一个 API 监听传入的请求并将它们转储到列表中。在一个单独的过程中,我想在附加列表时触发某种操作。我尝试实例化一个新进程(来自多处理),但它不会在启动后更新数组的状态。


from multiprocessing import Process

import time


procs = []


def separateProcess(start, counter):

    while True:

        time.sleep(1)

        print("length of the list from separate Process: "+str(len(procs)))



if __name__ == '__main__':

    print("program started")


    counter = 0

    Process(target=separateProcess, args=(counter, counter)).start()

    print("program end")

    while True:

        counter += 1

        newstring = "string "+str(counter)

        procs.append(newstring)

        print("length of the list from main: " + str(len(procs)))

        time.sleep(2)

这是输出:


length of the list from main: 1

length of the list from separate Process: 0

length of the list from main: 2

length of the list from separate Process: 0

length of the list from separate Process: 0

length of the list from main: 3

length of the list from separate Process: 0

length of the list from separate Process: 0


万千封印
浏览 141回答 1
1回答

慕后森

创建新的子进程时,它会获得父进程地址空间的副本,但是任何后续更改(无论是父进程还是子进程)都不会反映在其他进程的内存中。他们每个人都有自己的私人地址空间。您可以创建一个Manager()并改用其共享列表对象:import time  from multiprocessing import Manager, Processdef separateProcess(start, counter):    while True:        time.sleep(1)        print("length of the list from separate Process: "+str(len(procs)))if __name__ == '__main__':    m = Manager()    procs = m.list()    print("program started")    counter = 0    Process(target=separateProcess, args=(counter, counter)).start()    print("program end")    while True:        counter += 1        newstring = "string "+str(counter)        procs.append(newstring)        print("length of the list from main: " + str(len(procs)))        time.sleep(2)这种方法有一些开销,因为它会产生一个子进程来托管服务器Manager。如果您可以调整工作进程逻辑以改为使用队列,这里有一个示例:import randomimport timefrom multiprocessing import cpu_count, Process, Queuedef worker(q):    for item in iter(q.get, 'STOP'):        t = random.uniform(1, 5)        print(f'START item: {item}')        time.sleep(t)        print(f'END item: {item}, ({t:.3f}s)')def main():    cpus = cpu_count()    q = Queue()    for i in range(5):        q.put(i)    for i in range(cpus):        Process(target=worker, args=(q,)).start()    for i in range(cpus):        q.put('STOP')if __name__ == '__main__':    main()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python