当您使用
multiprocessing
在Python中,它实际上创建了一个新的独立Python进程,并根据您的要求运行它。事实上,API被简化了
看
喜欢
multithreading
不应该让你困惑。在主流程中,创建
AnytimeAlgorithm
对象然后,创建
Process
运行函数的;这将创建一个新进程并复制解释器的状态,因此您有一个
AnytimeAlgorithm算法
在新流程中也可以使用。然而,这两个对象并不相同,它们甚至不在同一个过程中,因此它们不能(直接)共享任何信息。在新流程中对对象所做的更改仅影响该流程中的对象副本,而不影响原始副本。
您可以查看有关如何在主进程和派生进程之间共享信息的文档,例如
pipes, queues
或
shared memory
,这可能是一个很好的选择:
import multiprocessing
import random
import numpy as np
class AnytimeAlgorithm:
def __init__(self, vector):
self.vector = vector
self.result = multiprocessing.Value('d', 0.0)
def update_forever(self):
while True:
i = random.randint(0, len(self.vector) - 1)
if self.vector[i] > self.result.value:
self.result.value = self.vector[i]
print("self", self, "result", self.result.value)
def result_after(self, seconds):
p = multiprocessing.Process(target=self.update_forever, name="update_forever", args=())
p.start()
p.join(seconds)
if p.is_alive():
p.terminate()
p.join()
print("self", self, "final result", self.result.value)
return self.result.value
if __name__ == "__main__":
import random, numpy as np
vector = np.random.rand(10000000)
maximizer = AnytimeAlgorithm(vector)
print(maximizer.result_after(0.1))
输出:
self <__mp_main__.AnytimeAlgorithm object at 0x0000017D26AB7898> result 0.01491873361800522
self <__mp_main__.AnytimeAlgorithm object at 0x0000017D26AB7898> result 0.060776471658675835
self <__mp_main__.AnytimeAlgorithm object at 0x0000017D26AB7898> result 0.7476611733129928
self <__mp_main__.AnytimeAlgorithm object at 0x0000017D26AB7898> result 0.9468162088782311
self <__mp_main__.AnytimeAlgorithm object at 0x0000017D26AB7898> result 0.9531978645650057
self <__mp_main__.AnytimeAlgorithm object at 0x0000017D26AB7898> result 0.9992671080742871
self <__mp_main__.AnytimeAlgorithm object at 0x0000017D26AB7898> result 0.999293465561661
self <__mp_main__.AnytimeAlgorithm object at 0x0000017D26AB7898> result 0.9996894825552965
self <__mp_main__.AnytimeAlgorithm object at 0x0000017D26AB7898> result 0.9998511378366163
self <__mp_main__.AnytimeAlgorithm object at 0x0000017D26AB7898> result 0.999933119926922
self <__main__.AnytimeAlgorithm object at 0x00000195FBDC7908> final result 0.999933119926922
0.999933119926922
请注意,使用
Value
由于进程间同步访问,会产生额外的开销。阅读文档以了解该类的锁定工作原理,并考虑以最小化对共享资源访问的方式编写算法(例如,使用在每次计算结束时编写的时态局部变量)。