如何在python中优化使用多线程和多处理?
我用Python创建了一个需要并行(或串行)执行多个可执行文件的处理器类。处理器和可执行类可能如下所示:如何在python中优化使用多线程和多处理?,python,multithreading,parallel-processing,multiprocessing,gil,Python,Multithreading,Parallel Processing,Multiprocessing,Gil,我用Python创建了一个需要并行(或串行)执行多个可执行文件的处理器类。处理器和可执行类可能如下所示: Class Processor(object): executables: list() # list of Executable objects should_execute_in_parallel: bool attr1: object attr2: object def process(): # Pre-processing
Class Processor(object):
executables: list() # list of Executable objects
should_execute_in_parallel: bool
attr1: object
attr2: object
def process():
# Pre-processing
# Execute all executables serailly/parallely based on self.should_execute_in_parallel
# Post-processing
Class Executable(object):
cmd: str # command string to execute
attr1: object
attr2: object
我创建了一个Executor类,它接受一个可执行文件并执行它
class Executor(object):
def __init__(self, executable):
self.executable = executable
# This is to demonstrate that Executor object is stateful
self.executable_id = self._get_executable_id(self.executable)
def execute():
# Pre-processing (I/O bound, depends on self)
# Launch separate process for self.executable & monitor (I/O during each monitoring phase)
# Post-processing (I/O bound, depends on self)
我希望在Processor.process()中并行化Executor.execute()。由于每个Executor.execute()调用都会产生一个新的Python进程,因此在处理器级别进行多处理可能会过度。因此,我正在考虑为每个Executor对象使用多个线程,这反过来将为各自的可执行文件生成一个新进程,并继续监视它
注意:Executor.execute()启动的进程需要由Executor对象定期监视,为此我使用python alarm。I/O发生在每个监视阶段
我认为使用单进程、单线程和。如果您的代码正在生成其他程序,请以非阻塞方式执行。在回答您的问题时,请允许我提供以下答案,希望对您有所帮助 一,。python中是否有推荐/最佳的方法将多线程与多处理相结合(如上所述)
如果您在系统中调用不同的进程,请考虑使用从A所管理的各种线程调用的进程。如果你真的需要独立于吉尔的进程,那么就考虑一下,或者看看你是否应该使用像DASK这样的并发/分布式任务调度程序。 二,。只要Executor.execute()不受CPU限制(不包括派生的进程),就会有任何GIL问题吗
GIL总是会有一些问题,除非您从正在运行的python解释器中分发,这可以通过上面提到的方法实现。从我的理解来看,当在该对象之外运行操作系统进程时,当前使用的线程仍将与GIL交互(我相信有人能比我更好地解释这一点…) 三,。如果执行器对象是无状态的,那么在这里实现并行性会更容易吗 从某种意义上说,它们总是有状态的,除非您将它们从启动它们的初始过程中分离出来。我认为,如果您在操作系统中运行子进程,您可以对多个执行器执行多线程并让它们运行 四,。有没有更好的方法来解决这个用例 我真的希望这能有所帮助,毫无疑问,因为这对我来说是一个早期的答案,我可以改进我的解释祝你好运 嘿,吉姆,谢谢你详细的回答。它帮助我更好地理解这里的理论,并决定如何继续使用我的用例。