- 代码的主要方法可以旋转一个新线程和新过程吗?请查看以下示例代码中的主要方法以澄清问题
- 如果对先前问题的答案是肯定的:在这种情况下,将线程传递到该过程时修改的数据对象,是否需要成为对象的深度副本?还是可以直接引用,因为它是父行为的一部分?
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()
关于第一个问题:是的,您可以在主线程创建过程或更多线程的同时创建一个线程来执行某些任务...我不明白为什么这应该是问题给你。当您创建线程时,线程将跳到线程目标,主线程将继续使用下一个指令,这可能是在创建一个过程。
对于第二个问题,如果您没有为子过程设置共享存储页,则所有过程内存都是"深度复制"的(引号适用,因为它实际上是复制品(,因此新过程不会知道该线程对对象所做的工作,因为将有一个新的副本,包括对象。
但是,您正在面对自己的种族条件:由于线程可以修改对象,因此它将取决于创建新过程的确切时刻,即它将具有新的或旧值。无论如何,新过程都不会看到其他线程进行的任何进一步的更改。
如果您确实设置了共享内存页面(多处理。shared_memory(,则儿童进程实际上将看到线程完成的所有更改。