P.S。下面的代码行为符合预期。问题是这是否可以接受?或者,如果以下代码存在某些极端情况或明显问题,那么我可能会忽略
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()
答案 0 :(得分:2)
关于第一个问题:是的,您可以创建一个线程来执行某些任务,而主线程创建一个进程,或者更多线程...我不明白为什么这对您来说是个问题。创建线程时,该线程将跳转到线程目标,并且主线程将继续执行下一条指令,这可能恰好是在创建进程。
对于第二个问题,如果您没有为子进程设置共享内存页面,则所有进程内存都是“深度复制”的(引号适用,因为它实际上是写时复制),因此是新进程不会知道线程对对象做了什么,因为将会有包括对象在内的所有内容的新副本。
但是,您面临一个竞争条件:由于线程可以修改对象,因此它取决于新进程创建的确切时间,它将具有新值还是旧值。无论如何,新进程将看不到其他线程所做的任何进一步更改。
如果您确实设置了共享内存页面(multiprocessing.shared_memory),则子进程实际上将看到该线程所做的所有更改。