与多处理和共享变量一起运行两个函数

Posted

技术标签:

【中文标题】与多处理和共享变量一起运行两个函数【英文标题】:Running two function together with multiprocessing and share variables 【发布时间】:2022-01-10 06:10:27 【问题描述】:

我使用了多处理,但我不知道该怎么做

逻辑:变量 sign 等于 0,使用名为 timer 的函数计数 20 秒,然后每秒检查 sign 是否等于 1打印一些东西并打破循环,同时使用一个名为 waiting 的函数等待来自另一个库的输入,例如“discord”或“socket”,所以如果输入等于我的键翻转变量符号为 1 并影响第一个函数 timer

import multiprocessing
from time import sleep
sign = 0

def timer():
    for s in range(20):
        if sign == 1: # if the input is equal to the secret key then break the timer
            print("Yes!")
            break
        else:
            sleep(1) #if not then continue timing

def waiting():
    # maybe it waits for an input or a message from "discord or whatsapp"
    if message == "secret_key":
        sign = 1

p1 = multiprocessing.Process(target=timer)
p2 = multiprocessing.Process(target=waiting)
p1.start()
p2.start()

【问题讨论】:

请为您的应用程序使用带条件变量的互斥锁。您必须使用信号量或使用共享资源的互斥锁。 你能解释一下互斥锁或将我重定向到一个链接 实际上需要一两天时间。但是了解多线程和多处理概念并更好地了解您到底想做什么总是更好。因此,在这里我将为您提供一个链接,它可以为您提供完整的概述。 toptal.com/python/… 其实这种情况下,只需要使用multiprocessing.Event()即可。由于您的程序只是测试是否发生了“事件”,因此您可以避免使用信号量或互斥体。虽然你应该知道它们是什么。 【参考方案1】:

我在上面的评论中提到了它,但这里是你如何使用事件

import time
import multiprocessing as mp

def timer(exit_event):
    for s in range(20):
        if exit_event.is_set():
            print("Yes!")
            break
        else:
            time.sleep(1) #if not then continue timing

def waiting(exit_event):
    # maybe it waits for an input or a message from "discord or whatsapp"
    time.sleep(5)
    exit_event.set()
    

if __name__ == '__main__':
    exit_event = mp.Event()
    p1 = mp.Process(target=timer, args=(exit_event,))
    p2 = mp.Process(target=waiting, args=(exit_event,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

然而,使用Event 的真正方法是只使用wait() 使其变为真实。无需睡眠循环。

def timer(exit_event):
    if exit_event.wait(timeout=20)
        # returns True if the event is True.  False if timed out
        print("Yes!")

【讨论】:

是的,这也是一种简单方法的好方法。从我这边 +1 @NikhilGowdaShivaswmay。我认为简历水平相当低。虽然我偶尔会使用它们,但几乎总是有一些更简单的高级功能。 我绝对同意你的看法。 谢谢...顺便说一句,我使用了睡眠循环,因为它给了我更多的控制权,我可以在睡眠循环中包含更多的 if else 语句 没关系。但是无论如何都使用if event.wait(timeout) 而不是sleep(timeout); if event.is_set()

以上是关于与多处理和共享变量一起运行两个函数的主要内容,如果未能解决你的问题,请参考以下文章

一起学Python: 多线程-共享全局变量问题

使用循环多处理共享变量

TensorFlow——共享变量的使用方法

2. Spark原理-RDD及共享变量

Delphi XE2:在两个不同的进程之间共享一个变量?

Solaris 共享库和全局变量