集团主站
欢迎来到成都达内官方网站!达内—美国上市公司 亿元级外企IT培训企业!
成都it培训哪家好
成都it培训哪家好
全国服务监督电话:15023458194  |   联系客服   |
当前位置:主页 > 培训课程 > Python >

成都Python培训机构:Python多进程的应用讲解

发布者: 成都达内     浏览次数:     发布时间:2020-07-23 10:25:38

成都Python培训机构:Python多进程的应用讲解——使用多进程有很多优点:多进程使用独立的内存空间,相比于线程,代码更加直观,能够使用多个CPU/多核。...

  使用多进程的优点

  使用多进程有很多优点:

  多进程使用独立的内存空间

  相比于线程,代码更加直观

  能够使用多个CPU/多核

  避免GIL

  子进程可以被kill(和thread不同)

  multiprocessing有和threading.Thread类似的接口

  对CPU绑定的进程比较好(加密,二进制搜索,矩阵乘法等)

  下面我们来看看使用多进程有什么缺点:

  使用多进程的缺点

  使用多进程也有一些缺点:

  进程间通信更加复杂

  内存的占用大于线程

  使用multiprocessing来创建进程

  multiprocessing是用来模拟threading.Thread类工作的。下面就是一个使用它的例子:

  import multiprocessing

  import random

  import time

  def worker(name: str) -> None:

  print(f'Started worker {name}')

  worker_time = random.choice(range(1, 5))

  time.sleep(worker_time)

  print(f'{name} worker finished in {worker_time} seconds')

  if __name__ == '__main__':

  processes = []

  for i in range(5):

  process = multiprocessing.Process(target=worker,

  args=(f'computer_{i}',))

  processes.append(process)

  process.start()

  for proc in processes:

  proc.join()

  首先第一步需要import multiprocessing模块,另外两个import分别是为random和time服务的。

  worker函数就是用来假装做一些事情,传入一个name的参数,没有什么返回,他首先打印name的值,然后随机sleep一段时间用来模拟做一段很长时间的工作,最后打印work finish。

  紧接着,你使用multiprocessing.Process创建了5个进程,他的使用和threading.Tread()比较类似,你告诉Process哪个目标函数需要调用,以及会传入什么参数给他们,然后你调用了start函数来启动进程。另外你会把这些进程加入到一个list中。

  最后,你遍历这个list,调用join方法,这个方法其实就是告诉Python等到进程结束。

  假如你run这个函数,你会看到类似下面这样的输出:

  成都Python培训机构:Python多进程的应用讲解

  其实你每次运行这个函数,结果都会有稍许的不同,主要还是因为你调用了random函数,你可以试试,看看你自己的输出。

  Process的子类化

  multiporcessing模块中的Process类是可以子类化的,他和threading.thread的类差不多。我们来看下面代码:

  # worker_thread_subclass.py

  import random

  import multiprocessing

  import time

  class WorkerProcess(multiprocessing.Process):

  def __init__(self, name):

  multiprocessing.Process.__init__(self)

  self.name = name

  def run(self):

  """

  Run the thread

  """

  worker(self.name)

  def worker(name: str) -> None:

  print(f'Started worker {name}')

  worker_time = random.choice(range(1, 5))

  time.sleep(worker_time)

  print(f'{name} worker finished in {worker_time} seconds')

  if __name__ == '__main__':

  processes = []

  for i in range(5):

  process = WorkerProcess(name=f'computer_{i}')

  processes.append(process)

  process.start()

  for process in processes:

  process.join()

  这里,我们写了一个multiprocess.Process()的子类,并且重写了run()方法。

  其他方面和上面的例子其实是类似的,现在我们可以来看看具体的输出,和上面的也类似。

  成都Python培训机构:Python多进程的应用讲解

  创建一个进程池

  假如你有很多进程需要运行,有时你希望能够限制进程运行的数目。比如说,你需要运行20个进程,但是你只有4个核,那么你可以使用multiprocessing模块来创建一个进程池,用它来限制每次进程运行的数目到4个。

  下面是示例的代码:

  import random

  import time

  from multiprocessing import Pool

  def worker(name: str) -> None:

  print(f'Started worker {name}')

  worker_time = random.choice(range(1, 5))

  time.sleep(worker_time)

  print(f'{name} worker finished in {worker_time} seconds')

  if __name__ == '__main__':

  process_names = [f'computer_{i}' for i in range(15)]

  pool = Pool(processes=5)

  pool.map(worker, process_names)

  pool.terminate()

  这个例子中,worker函数还是一样的,主要是后面的代码, 我们创建了一个进程池,它的数目是5,也就意味着最大的运行数目是5。使用这个pool,你需要调用map()方法,然后把你需要的调用的方法和参数传递给他。

  这样的话,Python每次只会使用5个进程来运行直到结束。最后你需要调用terminate()函数,否则你会发现下面的错误:

  /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/resource_tracker.py:216:

  UserWarning: resource_tracker: There appear to be 6 leaked semaphore objects to clean up at shutdown

  这个代码的具体输出如下所示:

  成都Python培训机构:Python多进程的应用讲解

(责任编辑:范老师)
最新开班
  • 成都Java培训班
    免费试听名额发放中...
  • 成都C++培训班
    免费试听名额发放中...
  • 成都PHP培训班
    免费试听名额发放中...
  • 成都网络工程培训班
    免费试听名额发放中...
  • 成都Unity3D培训班
    免费试听名额发放中...
  • 成都大数据培训班
    免费试听名额发放中...
  • 成都uid培训班
    免费试听名额发放中...
  • 成都会计培训班
    免费试听名额发放中...
  • 成都Python培训班
    免费试听名额发放中...
  • 成都嵌入式培训班
    免费试听名额发放中...
  • 成都web培训班
    免费试听名额发放中...
  • 成都软件测试培训班
    免费试听名额发放中...
在线留言
提交

校区地址:成都市锦江区东大街紫东楼端35号明宇金融广场19楼1906室

联系电话:15023458194

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市高新区奥克斯广场蜀锦路209号一楼商铺

联系电话:15023458194

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

校区地址:成都锦江区东大街芷泉街229号东方广场C座3楼303

联系电话:15023458194

公交路线:芷泉街(188路;115路;515路;236路;505路;501路;84路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市武侯区佳灵路3号红牌楼广场2号写字楼11楼1115号

联系电话:15023458194

公交路线:红牌楼东(11路;92路;100路;111路;139路;g28路;快速公交K1/K2) 地铁路线:红牌楼站(地铁3号线)

校区地址:成都市锦江区红星路二段70号四川日报大厦502-2

联系电话:15023458194

公交路线:市二医院站(6路;49路;102路;5路;37路;g92路;) 地铁路线:地铁市二医院(地铁3号线)

校区地址:成都市锦江区东大街芷泉段229号东方广场C座16层

联系电话:15023458194

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:四川省成都市武侯区高新科技孵化园9号园区E座7楼

联系电话:15023458194

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

校区地址:成都市高新区奥克斯广场B座1708

联系电话:15023458194

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

了解达内动态
关注成都达内教育公众号

首页 | 关于达内 | 课程中心 | 专家师资 | 视频教程 | 学员空间 | 校企合作 | 新闻资讯 | 就业指导 | 网站地图

2016-2025 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56