附:以下代码按预期运行。问题在于这是否是可接受的解决方案?或者如果下面的代码存在一些边缘情况或明显的问题,我可能会忽略
import threading
from multiprocessing import process
from copy import deepcopy
from threading import Lock
import time
class ABC:
def __init__(self, lock):
self.object = []
self.lock = lock
def modify_list(self):
while condition_true:
self._modify_list()
time.sleep(few_minutes)
def _modify_list(self):
with self.lock:
''' Does something to modify self.object'''
class XYZ:
def __init__(self, abc_obj):
self.abc_obj = abc_obj
def read_obj(self):
''' Performs the read operation on the abc_obj'''
def main():
lock = Lock()
abc = ABC(lock)
t1 = threading.Thread(target=abc.modify_list)
t1.start()
while condition_true:
with lock:
xyz = XYZ(deepcopy(abc.object))
p1 = process.Process(target=xyz.read_obj)
p1.start()
p1.join()
t1.join()
关于第一个问题:是的,你可以创建一个线程来执行一些任务,而主线程创建一个进程,或更多的线程...我不明白为什么这应该是一个问题给你。当您创建线程时,线程将跳转到线程目标,主线程将继续执行下一条指令,这可能恰好创建了一个进程。
对于第二个问题,如果您没有为子进程设置共享内存页面,则所有进程内存都是“深度复制”(引用适用,因为它实际上是写入时复制),因此新进程不会知道线程对对象做了什么,因为会有一个新的副本,包括对象。
但是,您面临着竞争条件:由于线程可以修改对象,因此它将取决于创建新进程的确切时刻,它将具有新值或旧值。无论如何,新流程都不会看到其他线程所做的任何进一步更改。
如果你设置了一个共享内存页面(multiprocessing.shared_memory),那么子进程实际上会看到线程完成的所有更改。