Python中多处理内部的多线程

Python中多处理内部的多线程,python,multithreading,multiprocessing,concurrent.futures,Python,Multithreading,Multiprocessing,Concurrent.futures,我正在使用concurrent.futures模块进行多处理和多线程处理。我在一台8核机器上运行它,该机器带有16GB RAM,是英特尔i7第8代处理器。我在Python3.7.2甚至Python3.8.2上尝试了这个 import concurrent.futures import time 获取列表并将每个元素乘以2 def double_value(x): y = [] for elem in x: y.append(2 *elem) return y def g

我正在使用concurrent.futures模块进行多处理和多线程处理。我在一台8核机器上运行它,该机器带有16GB RAM,是英特尔i7第8代处理器。我在Python3.7.2甚至Python3.8.2上尝试了这个

import concurrent.futures
import time
获取列表并将每个元素乘以2
def double_value(x):
  y = []
  for elem in x:
    y.append(2 *elem)
  return y
 def get_double_value(x):
  with concurrent.futures.ThreadPoolExecutor() as executor:
    results = executor.map(double_single_value, x)
  return list(results)
将一个元素乘以2
def double_single_value(x):
  return 2* x
定义一个 函数运行多线程并将每个元素乘以2
def double_value(x):
  y = []
  for elem in x:
    y.append(2 *elem)
  return y
 def get_double_value(x):
  with concurrent.futures.ThreadPoolExecutor() as executor:
    results = executor.map(double_single_value, x)
  return list(results)
下面显示的代码运行了115秒。这仅使用多处理。这段代码的CPU利用率为100% 下面的函数花费了9分钟以上,消耗了系统的所有Ram,然后系统终止了所有进程。此外,这段代码期间的CPU利用率不高达100%(~85%) 我真的很想了解:

1) 为什么先拆分多个处理,然后运行尝试多线程的代码运行速度不如只运行多个处理的代码快? (我读过很多描述多处理和多线程的帖子,其中一个关键点是多线程是针对I/O进程的,多处理器是针对CPU进程的?)

2) 为了最大限度地利用分配的内核(或CPU),有没有更好的方法在多处理内部执行多线程? 3) 为什么最后一段代码消耗了所有RAM?这是因为多线程吗?正如你所说:“我已经阅读了许多描述多处理和多线程的帖子,我得到的关键之一是多线程是用于I/O进程和CPU进程的多处理”


您需要弄清楚,如果您的程序是IO绑定的还是CPU绑定的,那么应用正确的方法来解决您的问题。随机或同时应用各种方法通常只会让事情变得更糟。

在干净的Python中使用线程处理CPU受限的问题是一种糟糕的方法,无论是否使用多处理。尝试重新设计您的应用程序,使其仅使用多处理或使用第三方LIB,如等

我的双值函数有什么作用?@Paul my bad,这是错误的,我已更正。现在请检查您使用的python版本是什么?ThreadPoolExecutor已经改变了它在3.8中默认情况下愿意产生的工作人员数量。我正在使用Python 3.7.2对于CPU受限的任务,每个CPU的进程效率与您将得到的一样高,假设CPU受限的任务足够大,足以保证启动进程并向其传输数据的开销。在CPython中,由于GIL,线程对CPU受限的任务没有任何帮助。是的,即使在我目前的情况下,多线程也起到了主导作用,但操作是为了获得数字的两倍,这是一个面向CPU的进程。请提供更多信息,为什么即使Python附带了threading lib,这也是一种不好的做法?他们正在处理开设GIL的所有问题。
t = time.time()
with concurrent.futures.ProcessPoolExecutor() as executor:
  my_results = executor.map(get_double_value, a)

print(time.time()-t)