【问题标题】:Observers on multiprocessing多处理观察者
【发布时间】:2020-05-22 13:44:49
【问题描述】:

我正在做一个需要多处理的 GUI。所以我有一个进程是 GUI,另一个进程永远运行,它是一个调度程序。他们通过 manager.list() 共享 var 调度程序(保存事件并管理它们)。 当 GUI 接收来自用户的输入(单击按钮)时,它会在调度程序上添加一个事件并更新此 var 以用于 bouth 进程。 在运行调度程序事件的另一个进程上,当一个事件完成时,它也会修改 var 调度程序。 我的问题是,当它发生时,我需要通知其他进程才能重新加载小部件。我试图实现Observer,但由于多处理,我无法这样做。

你知道有什么办法吗?

【问题讨论】:

  • 继续阅读queue.Queue.task_done
  • 我尝试使用 Queue 而不是 manager.list() 但它们使 GUI 慢得离谱。所以这对我来说不是一个有用的解决方案。

标签: python multiprocessing observer-pattern


【解决方案1】:

我通过执行以下操作来实现它:-创建两个 manager.list 一个用于共享调度程序 var,第二个用于共享布尔列表。

一旦任务完成,我会在任务中添加一个 True。因此,通过使用检查这个 manager.list() 的函数刷新来在里面找到 True。一旦找到 True ,它就会重置列表并重新加载小部件。

'''SUPPORT FUCTIONS TO TREAT THE MANAGER.LIST'''

def getupdate(schrec):
    if len(schrec)>0:
        return schrec[-1]


def loadupdate(schrec,sch):
    schrec[:]=[]
    schrec.append(sch)


def clear_fogt(ogtrec):
    ogtrec[:]=[]
    ogtrec.append(False)

'''WAITS UNTIL FIND True INSIDE ogtrec ( that is a manager.list() )'''

 def refresh():
        if True in ogtrec:
            clear_fogt(ogtrec)
            plot_scheduler()
        root.after(1000, refresh)
        print('refresh')


'''RUNS THE SCHEDULER'''

def sched_run(schrec,ogtrec):
    while True:
        #get last update of scheduler var
        scheduler = getupdate(schrec)

        while len(scheduler.og) == 0:
            time.sleep(0.5)
            #get last update of scheduler var
            scheduler = getupdate(schrec)

        print('Scheduler list not empty')

        #reload widg some bool change value
        ogtrec.append(True)

        #RUN
        scheduler.send_task_rob()
        print('Task is executing')
        print(simulation_robot_working(scheduler))
        time.sleep(simulation_robot_working(scheduler))
        scheduler.check_timing()
        print('Checked')

        #get last update of scheduler var
        scheduler = getupdate(schrec)
        scheduler.finish_og()
        print('OG updated')

        #update scheduler value
        loadupdate(schrec, scheduler)

        #reload widg
        ogtrec.append(True)
        print('finished')
        print(scheduler.og)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 2021-12-30
    • 1970-01-01
    • 2016-08-13
    • 2017-06-15
    • 1970-01-01
    相关资源
    最近更新 更多