运行 在 python 中同时运行
Running functions siultaneoulsy in python
我正在制作一个小程序,其中我需要一些函数来检查后台的某些内容。
我确实同时使用了模块线程和所有这些函数 运行,在我开始添加更多函数之前,一切都运行良好。当线程模块创建新线程时,它们都在同一个进程中,所以当我添加更多线程时,它们开始互相减慢速度。
问题不在于 CPU,因为它的利用率从未达到 100% (i5-4460
)。我还尝试了 multiprocessing 模块,它为函数创建了一个新进程,但似乎变量不能在不同进程之间共享,或者我不知道如何共享。 (每个函数的新启动进程似乎都带有现有变量,但我的主程序无法访问单独进程中函数所做的任何更改,甚至无法访问它创建的新变量)
我尝试使用 global
关键字,但它似乎对多处理没有影响,就像在线程中一样。
我该如何解决这个问题?
我很确定我必须为这些后台功能创建新流程,但我需要从他们那里得到一些反馈,而那部分我不知道要解决。
据我了解你的问题,你需要限制“处理器”的数量。
在这种情况下,我通常做的是生成固定数量(因此可通过参数配置)的处理器(即线程或进程),我称之为工作人员。
然后我使用共享任务队列 (https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Queue) 向工作人员发送他们要做的工作,然后我使用另一个共享队列,他们可以将结果放入其中。
工作人员甚至可以填充任务队列,因此您可以根据需要从工作人员添加新任务。
根据 docs.python.org 上关于“threading — 基于线程的并行性”的文档,它明确指出:
CPython implementation detail: In CPython, due to the Global Interpreter Lock, only one thread can execute Python code at once (even though certain performance-oriented libraries might overcome this limitation). If you want your application to make better use of the computational resources of multi-core machines, you are advised to use multiprocessing or concurrent.futures.ProcessPoolExecutor. However, threading is still an appropriate model if you want to run multiple I/O-bound tasks simultaneously.
我最终使用了多处理值
我正在制作一个小程序,其中我需要一些函数来检查后台的某些内容。
我确实同时使用了模块线程和所有这些函数 运行,在我开始添加更多函数之前,一切都运行良好。当线程模块创建新线程时,它们都在同一个进程中,所以当我添加更多线程时,它们开始互相减慢速度。
问题不在于 CPU,因为它的利用率从未达到 100% (i5-4460
)。我还尝试了 multiprocessing 模块,它为函数创建了一个新进程,但似乎变量不能在不同进程之间共享,或者我不知道如何共享。 (每个函数的新启动进程似乎都带有现有变量,但我的主程序无法访问单独进程中函数所做的任何更改,甚至无法访问它创建的新变量)
我尝试使用 global
关键字,但它似乎对多处理没有影响,就像在线程中一样。
我该如何解决这个问题?
我很确定我必须为这些后台功能创建新流程,但我需要从他们那里得到一些反馈,而那部分我不知道要解决。
据我了解你的问题,你需要限制“处理器”的数量。
在这种情况下,我通常做的是生成固定数量(因此可通过参数配置)的处理器(即线程或进程),我称之为工作人员。
然后我使用共享任务队列 (https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Queue) 向工作人员发送他们要做的工作,然后我使用另一个共享队列,他们可以将结果放入其中。
工作人员甚至可以填充任务队列,因此您可以根据需要从工作人员添加新任务。
根据 docs.python.org 上关于“threading — 基于线程的并行性”的文档,它明确指出:
CPython implementation detail: In CPython, due to the Global Interpreter Lock, only one thread can execute Python code at once (even though certain performance-oriented libraries might overcome this limitation). If you want your application to make better use of the computational resources of multi-core machines, you are advised to use multiprocessing or concurrent.futures.ProcessPoolExecutor. However, threading is still an appropriate model if you want to run multiple I/O-bound tasks simultaneously.
我最终使用了多处理值