你能用相同的代码启动一个线程和一个进程吗?

问题描述 投票:0回答:1
  1. 代码的主要方法可以启动新线程和新进程吗?请查看以下示例代码中的主要方法以澄清问题
  2. 如果前面问题的答案是肯定的:在这种情况下,线程在传递给进程时修改的数据对象是否需要是对象的深层复制?或者可以直接引用它,因为它是父主进程的一部分?

附:以下代码按预期运行。问题在于这是否是可接受的解决方案?或者如果下面的代码存在一些边缘情况或明显的问题,我可能会忽略

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()
python multithreading multiprocessing
1个回答
2
投票

关于第一个问题:是的,你可以创建一个线程来执行一些任务,而主线程创建一个进程,或更多的线程...我不明白为什么这应该是一个问题给你。当您创建线程时,线程将跳转到线程目标,主线程将继续执行下一条指令,这可能恰好创建了一个进程。

对于第二个问题,如果您没有为子进程设置共享内存页面,则所有进程内存都是“深度复制”(引用适用,因为它实际上是写入时复制),因此新进程不会知道线程对对象做了什么,因为会有一个新的副本,包括对象。

但是,您面临着竞争条件:由于线程可以修改对象,因此它将取决于创建新进程的确切时刻,它将具有新值或旧值。无论如何,新流程都不会看到其他线程所做的任何进一步更改。

如果你设置了一个共享内存页面(multiprocessing.shared_memory),那么子进程实际上会看到线程完成的所有更改。

© www.soinside.com 2019 - 2024. All rights reserved.