python 简单示例中的并行多处理
Parallel multiprocessing in python easy example
我需要说多处理对我来说是新事物。我读了一些关于它的内容,但这让我更加困惑。我想通过一个简单的例子来理解它。假设我们在第一个函数中有 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抱歉造成混乱
由于进程位于单独的内存地址空间中,因此您不能共享变量。此外,您错误地使用了全局变量。 Here您可以查看有关如何使用全局变量的示例。
在进程之间共享信息的最直接方式是通过 Pipe
or Queue
。
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()
好的,这需要一些时间,但我想通了。一切都是关于 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 个函数,我只是递增 '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抱歉造成混乱
由于进程位于单独的内存地址空间中,因此您不能共享变量。此外,您错误地使用了全局变量。 Here您可以查看有关如何使用全局变量的示例。
在进程之间共享信息的最直接方式是通过 Pipe
or Queue
。
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()
好的,这需要一些时间,但我想通了。一切都是关于 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()