使用ThreadPool在Python中进行多线程

马蒂亚斯

我翻译C++ rendererPython所述C++渲染器使用螺纹,每个渲染的图像的一部分。我想在中做同样的事情Python不过,看来,我的多线程代码版本需要年龄相比,我的单线程代码版本。我是多处理新手,Python因此想知道下面的代码是否真正符合我的想法:创建线程池,添加并执行一些任务并等待所有任务完成?

我知道我无法与我的C++版本竞争,但我希望Python至少能打败单线程版本。

多线程代码

from multiprocessing.pool import ThreadPool

pool = ThreadPool(processes=4)
pool.map(run_task(...), range(11))
pool.close()
pool.join()

单线程代码

for i in range(11):
    Task(...)(i)

任务代码

def run_task(...):
    task = Task(...)
    return task.__call__

class Task():
    def __init__(self, ...):
        ...
    def __call__(self, i):
        ...

编辑:我尝试使用from multiprocessing import Pool这似乎使我的Python终端无法进入Canopy IDE当我从Windows命令行运行文件时,我收到:

C:\Users\Matthias\Documents\Courses\Masterproef\pbrt\Tools\Permeability\src>pyth
on renderer.py
Exception in thread Thread-2:
Traceback (most recent call last):
  File "C:\Users\Matthias\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.5.
2.2785.win-x86_64\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Users\Matthias\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.5.
2.2785.win-x86_64\lib\threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
  File "C:\Users\Matthias\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.5.
2.2785.win-x86_64\lib\multiprocessing\pool.py", line 342, in _handle_tasks
    put(task)
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin_
_.instancemethod failed

(这也是为什么我通常更喜欢线程而不是进程。因此,GIL设计决策对我而言并不真正有意义。)

mzc

您应该使用进程池而不是线程池(请参阅此处的第一个示例)。

由于CPython的GIL,不应将多线程用于CPU绑定任务

也许这个简短的示例会有所帮助(我们称之为example.py):

from multiprocessing import Pool
import sys

if __name__ == '__main__':

    job_list = [xrange(10000000)]*6

    if 'p' in sys.argv:
        p = Pool(2)
        print("Parallel map")
        print(p.map(sum, job_list))
    else:
        print("Sequential map")
        print(map(sum, job_list))

我的机器有2个内核,example.py p(并行)版本的速度是顺序内核的两倍。如果我们减少要完成的工作量(从十个数字而不是一千万个数字求和),则顺序版本会获胜,因为在并行版本中创建流程和委派任务会产生不必要的开销。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Process在Python中进行简单的多线程

来自分类Dev

使用QtConcurrent在QT中进行多线程

来自分类Dev

使用QtConcurrent在QT中进行多线程

来自分类Dev

高效的矩阵向量乘法:直接在Python中进行多线程与使用ctypes绑定多线程C函数

来自分类Dev

模拟多线程上下文以在Python中进行测试

来自分类Dev

如何在python中进行多线程处理?

来自分类Dev

使用window.after在tkinter中进行多线程

来自分类Dev

使用Windows API在C中进行多线程

来自分类Dev

使用ThreadPool和CountdownEvent的多线程

来自分类Dev

Python,使用Queue进行多线程

来自分类Dev

使用bash进行多线程

来自分类Dev

在Python中进行多线程处理时queue.Queue的正确实现

来自分类Dev

如何在python中进行多线程SQL查询,以便获得所有查询的结果

来自分类Dev

在 Python 中进行多线程/多处理时如何避免重复结果?

来自分类Dev

使用Python和C API进行多线程

来自分类Dev

使用python中的openCV进行多线程图像处理

来自分类Dev

如何在C ++中进行多线程文件处理?

来自分类Dev

Lambda无法在Kotlin中进行多线程操作

来自分类Dev

使用Condition对象在Python中进行线程间通信

来自分类Dev

python中使用并行线程的多线程

来自分类Dev

在python / BeautifulSoup中进行网络爬网时将值追加到可迭代对象(还想了解多线程)

来自分类Dev

在python / BeautifulSoup中进行网络爬网时将值追加到可迭代对象(还想了解多线程)

来自分类Dev

使用openMP进行多核处理与多线程

来自分类Dev

如何使用JavaFX进行多线程

来自分类Dev

使用libmysql进行多线程编程

来自分类Dev

使用多线程ConsoleWriteLine进行循环

来自分类Dev

多线程代码可使用配置的线程数进行工作

来自分类Dev

使用Python和pymongo的多线程

来自分类Dev

Python-在多线程中使用nonce

Related 相关文章

  1. 1

    使用Process在Python中进行简单的多线程

  2. 2

    使用QtConcurrent在QT中进行多线程

  3. 3

    使用QtConcurrent在QT中进行多线程

  4. 4

    高效的矩阵向量乘法:直接在Python中进行多线程与使用ctypes绑定多线程C函数

  5. 5

    模拟多线程上下文以在Python中进行测试

  6. 6

    如何在python中进行多线程处理?

  7. 7

    使用window.after在tkinter中进行多线程

  8. 8

    使用Windows API在C中进行多线程

  9. 9

    使用ThreadPool和CountdownEvent的多线程

  10. 10

    Python,使用Queue进行多线程

  11. 11

    使用bash进行多线程

  12. 12

    在Python中进行多线程处理时queue.Queue的正确实现

  13. 13

    如何在python中进行多线程SQL查询,以便获得所有查询的结果

  14. 14

    在 Python 中进行多线程/多处理时如何避免重复结果?

  15. 15

    使用Python和C API进行多线程

  16. 16

    使用python中的openCV进行多线程图像处理

  17. 17

    如何在C ++中进行多线程文件处理?

  18. 18

    Lambda无法在Kotlin中进行多线程操作

  19. 19

    使用Condition对象在Python中进行线程间通信

  20. 20

    python中使用并行线程的多线程

  21. 21

    在python / BeautifulSoup中进行网络爬网时将值追加到可迭代对象(还想了解多线程)

  22. 22

    在python / BeautifulSoup中进行网络爬网时将值追加到可迭代对象(还想了解多线程)

  23. 23

    使用openMP进行多核处理与多线程

  24. 24

    如何使用JavaFX进行多线程

  25. 25

    使用libmysql进行多线程编程

  26. 26

    使用多线程ConsoleWriteLine进行循环

  27. 27

    多线程代码可使用配置的线程数进行工作

  28. 28

    使用Python和pymongo的多线程

  29. 29

    Python-在多线程中使用nonce

热门标签

归档