您可以用相同的代码启动线程和进程吗?

时间:2019-05-01 21:57:26

标签: python multithreading multiprocessing

  1. 代码的主要方法可以启动新线程和新进程吗?请查看下面的示例代码中的主要方法以澄清问题
  2. 如果对先前问题的回答是:在那种情况下,线程将其修改的数据对象传递给进程时,是否需要将其复制为对象?还是因为它是父主流程的一部分而可以直接引用?

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()

1 个答案:

答案 0 :(得分:2)

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

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

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

如果您确实设置了共享内存页面(multiprocessing.shared_memory),则子进程实际上将看到该线程所做的所有更改。