【问题标题】:Parallel multiprocessing in python easy examplepython中的并行多处理简单示例
【发布时间】:2017-11-22 07:09:46
【问题描述】:

我需要说,多处理对我来说是新事物。我读了一些关于它的东西,但这让我更加困惑。我想通过一个简单的例子来理解它。假设我们在第一个函数中有 2 个函数,我只是增加 'a' 变量,然后将其分配给 'number' 变量,第二个我启动第一个函数,并且每隔一秒我想打印 'number' 变量。它应该看起来像:

global number

def what_number():
    a=1
    while True:
       a+=1
       number=a

def read_number():
    while True:
       --> #here I need to start 'what_number' function <--
        time.sleep(1)
        print(number)


if __name__ == "__main__":
    read_number()

我该怎么做?有没有一种简单而正确的方法来做到这一点?

更新:

我看到了 noxdafox 的回答,我真的很感激,但这并不是我想要的。首先,我不想在第一个函数中发送值(noxdafox 代码中的“main”)。其次,我不想获得所有值,因此 quene 将不起作用。我需要在每秒钟的 while 循环数之后得到。代码应该是这样的:

import multiprocessing
import time

number = 0


def child_process():
    global number
    while True:
        number += 1
        print(number)


def main():
    process = multiprocessing.Process(target=child_process)
    process.start()

    while True:
       print("should get same number:",number)
       time.sleep(0.001)

if __name__ == "__main__":
    main()

如果你运行上面的代码,你会得到类似:

但是这个蓝色选择的值应该是一样的!这是主要问题:)

P.S 对混乱感到抱歉

【问题讨论】:

标签: python python-3.x parallel-processing multiprocessing python-multiprocessing


【解决方案1】:

好的,这需要一些时间,但我想通了。这一切都是关于Sharing state between processes 现在一切都像魅力一样。代码:

from multiprocessing import Process, Value
import time


def child_process(number):
    number.value = 0
    while True:
        number.value += 1
        #print(number)


def main():
    num = Value('i')
    process = Process(target=child_process, args=(num,))
    process.start()
    while True:
       print("should get same number:", num.value)
       time.sleep(1)

if __name__ == "__main__":
    main()

【讨论】:

    【解决方案2】:

    由于进程存在于不同的内存地址空间中,因此您不能共享变量。此外,您错误地使用了全局变量。 Here你可以看到一个关于如何使用全局变量的例子。

    在进程之间共享信息最直接的方法是通过PipeQueue

    import multiprocessing
    
    def child_process(queue):
        while True:
            number = queue.get()
            number += 1
            queue.put(number)
    
    def main():
        number = 0
        queue = multiprocessing.Queue()
        process = multiprocessing.Process(target=child_process, args=[queue])
        process.start()
    
        while True:
            print("Sending %d" % number)
            queue.put(number)
    
            number = queue.get()
            print("Received %d" % number)
    
            time.sleep(1)
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

    • 感谢您的回答,但在这种情况下,我的数字每 1sec 增加 1 个。关键是要获得 while 循环的数量,你知道我的意思吗?
    • 我的意思是获取数字的值,其中数字在 while 循环中一直增加 1 秒 :)
    • 有办法做到这一点吗? pastebin.com/ehMv1j1p ?但现在它一直在付出 0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    相关资源
    最近更新 更多