为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

万千封印 2023-05-23 15:56:32
我有一个 API 监听传入的请求并将它们转储到列表中。在一个单独的过程中,我想在附加列表时触发某种操作。我尝试实例化一个新进程(来自多处理),但它不会在启动后更新数组的状态。from multiprocessing import Processimport timeprocs = []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: 1length of the list from separate Process: 0length of the list from main: 2length of the list from separate Process: 0length of the list from separate Process: 0length of the list from main: 3length of the list from separate Process: 0length of the list from separate Process: 0
查看完整描述

1 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

创建新的子进程时,它会获得父进程地址空间的副本,但是任何后续更改(无论是父进程还是子进程)都不会反映在其他进程的内存中。他们每个人都有自己的私人地址空间。

您可以创建一个Manager()并改用其共享列表对象:

import time

  

from multiprocessing import Manager, Process


def 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 random

import time


from multiprocessing import cpu_count, Process, Queue



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


查看完整回答
反对 回复 2023-05-23
  • 1 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信