Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中优化使用多线程和多处理?_Python_Multithreading_Parallel Processing_Multiprocessing_Gil - Fatal编程技术网

如何在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

我用Python创建了一个需要并行(或串行)执行多个可执行文件的处理器类。处理器和可执行类可能如下所示:

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中是否有推荐/最佳的方法将多线程与多处理相结合(如上所述)
  • 只要Executor.execute()不受CPU限制(不包括派生的进程),就会有任何GIL问题吗
  • 如果执行器对象是无状态的,那么在这里实现并行性会更容易吗
  • 有没有更好的方法来解决这个用例

  • 我认为使用单进程、单线程和。如果您的代码正在生成其他程序,请以非阻塞方式执行。

    在回答您的问题时,请允许我提供以下答案,希望对您有所帮助

    一,。python中是否有推荐/最佳的方法将多线程与多处理相结合(如上所述)

    如果您在系统中调用不同的进程,请考虑使用从A所管理的各种线程调用的进程。如果你真的需要独立于吉尔的进程,那么就考虑一下,或者看看你是否应该使用像DASK这样的并发/分布式任务调度程序。 二,。只要Executor.execute()不受CPU限制(不包括派生的进程),就会有任何GIL问题吗

    GIL总是会有一些问题,除非您从正在运行的python解释器中分发,这可以通过上面提到的方法实现。从我的理解来看,当在该对象之外运行操作系统进程时,当前使用的线程仍将与GIL交互(我相信有人能比我更好地解释这一点…)

    三,。如果执行器对象是无状态的,那么在这里实现并行性会更容易吗

    从某种意义上说,它们总是有状态的,除非您将它们从启动它们的初始过程中分离出来。我认为,如果您在操作系统中运行子进程,您可以对多个执行器执行多线程并让它们运行

    四,。有没有更好的方法来解决这个用例

    我真的希望这能有所帮助,毫无疑问,因为这对我来说是一个早期的答案,我可以改进我的解释


    祝你好运

    嘿,吉姆,谢谢你详细的回答。它帮助我更好地理解这里的理论,并决定如何继续使用我的用例。