通过进程队列

时间:2018-08-15 13:23:07

标签: python python-3.x multiprocessing

我刚刚开始熟悉python中的多处理,陷入了一个无法解决所需方法的问题,并且即使我想解决的问题也无法解决,我也找不到任何明确的信息。

我正在尝试做的事情类似于以下内容:

import time

from multiprocessing import Process, Event, Queue
from threading import Thread

class Main:
    def __init__(self):
        self.task_queue = Queue()

        self.process = MyProcess(self.task_queue)
        self.process.start()

    def execute_script(self, code):
        ProcessCommunication(code, self.task_queue).start()


class ProcessCommunication(Thread):
    def __init__(self, script, task_queue):
        super().__init__()

        self.script = script
        self.script_queue = task_queue

        self.script_end_event = Event()

    def run(self):
        self.script_queue.put((self.script, self.script_end_event))

        while not self.script_end_event.is_set():
            time.sleep(0.1)


class MyProcess(Process):
    class ExecutionThread(Thread):
        def __init__(self, code, end_event):
            super().__init__()
            self.code = code
            self.event = end_event

        def run(self):
            exec(compile(self.code, '<string>', 'exec'))
            self.event.set()

    def __init__(self, task_queue):

        super().__init__(name="TEST_PROCESS")

        self.task_queue = task_queue

        self.status = None

    def run(self):
        while True:
            if not self.task_queue.empty():
                script, end_event = self.task_queue.get()
                if script is None:
                    break

                self.ExecutionThread(script, end_event).start()

因此,我希望有一个单独的进程在主进程的整个运行期间运行,以在具有受限用户特权,受限命名空间的环境中执行用户编写的脚本。还要保护主进程免受潜在的无穷循环的困扰,而无需等待时间,而这不会给CPU内核带来太多负担。

使用该结构的示例代码如下:

if __name__ == '__main__':
     main_class = Main()

     main_class.execute_script("print(1)")

主进程可以同时启动多个脚本,我想将事件和执行请求一起传递给该进程,以便每当其中一个脚本完成时就通知主进程。

但是,Python进程Queue某种程度上不喜欢通过队列传递事件并引发以下错误。

'RuntimeError: Semaphore objects should only be shared between processes through inheritance'

当我为每个执行请求创建另一个事件时,无法在流程实例化时传递它们。

我想出了一种解决此问题的方法,即将标识符与代码一起传递,并基本上设置了另一个队列,只要设置了end_event,该队列便会随标识符一起提供。但是,事件的用法对我来说似乎更为优雅,我想知道是否有我尚未想到的解决方案。

0 个答案:

没有答案