Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下,不能发挥多核的优势。而使用多进程(Multiprocess),则可以发挥多核的优势真正地提高效率。
  对比实验
  资料显示,如果多线程的进程是CPU密集型的,那多线程并不能有多少效率上的提升,相反还可能会因为线程的频繁切换,导致效率下降,推荐使用多进程;如果是IO密集型,多线程进程可以利用IO阻塞等待时的空闲时间执行其他线程,提升效率。所以我们根据实验对比不同场景的效率
  操作系统 CPU 内存 硬盘 Windows 10 双核 8GB 机械硬盘 (1)引入所需要的模块
  <code class="python">import requests
  import time
  from threading import Thread
  from multiprocessing import Process</code>
  (2)定义CPU密集的计算函数
  <code class="python">def count(x, y):
  # 使程序完成150万计算
  c = 0
  while c < 500000:
  c += 1
  x += x
  y += y</code>
  (3)定义IO密集的文件读写函数
  <code class="python">def write():
  f = open("test.txt", "w")
  for x in range(5000000):
  f.write("testwrite ")
  f.close()
  def read():
  f = open("test.txt", "r")
  lines = f.readlines()
  f.close()</code>
  (4) 定义网络请求函数
  <code class="python">_head = {
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36'}
  url = "http://www.tieba.com"
  def http_request():
  try:
  webPage = requests.get(url, headers=_head)
  html = webPage.text
  return {"context": html}
  except Exception as e:
  return {"error": e}</code>
  (5)测试线性执行IO密集操作、CPU密集操作所需时间、网络请求密集型操作所需时间
  <code class="python"># CPU密集操作
  t = time.time()
  for x in range(10):
  count(1, 1)
  print("Line cpu", time.time() - t)
  # IO密集操作
  t = time.time()
  for x in range(10):
  write()
  read()
  print("Line IO", time.time() - t)
  # 网络请求密集型操作
  t = time.time()
  for x in range(10):
  http_request()
  print("Line Http Request", time.time() - t)</code>
  输出
  CPU密集:95.6059999466、91.57099986076355 92.52800011634827、 99.96799993515015
  IO密集:24.25、21.76699995994568、21.769999980926514、22.060999870300293
  网络请求密集型: 4.519999980926514、8.563999891281128、4.371000051498413、4.522000074386597、14.671000003814697
  (6)测试多线程并发执行CPU密集操作所需时间
  <code class="python">counts = []
  t = time.time()
  for x in range(10):
  thread = Thread(target=count, args=(1,1))
  counts.append(thread)
  thread.start()
  e = counts.__len__()
  while True:
  for th in counts:
  if not th.is_alive():
  e -= 1
  if e <= 0:
  break
  print(time.time() - t)</code>
  Output: 99.9240000248 、101.26400017738342、102.32200002670288
  (7)测试多线程并发执行IO密集操作所需时间
  <code class="Python">def io():
  write()
  read()
  t = time.time()
  ios = []
  t = time.time()
  for x in range(10):
  thread = Thread(target=count, args=(1,1))
  ios.append(thread)
  thread.start()
  e = ios.__len__()
  while True:
  for th in ios:
  if not th.is_alive():
  e -= 1
  if e <= 0:
  break
  print(time.time() - t)</code>
  Output: 25.69700002670288、24.02400016784668