我刚刚开始熟悉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,该队列便会随标识符一起提供。但是,事件的用法对我来说似乎更为优雅,我想知道是否有我尚未想到的解决方案。