当前位置: 首页 > 网络应用技术

Python并发编程多线程和线程池

时间:2023-03-08 10:34:12 网络应用技术

  方案1:一个网络横梁,订单为1小时,并同时下载到20分钟;方案2:一个应用程序应用程序,每次需要3秒钟才能在优化之前打开页面,并使用异步并发,每次开放到200个200.millisecond。

  实际上,并发的引入是提高程序的运行速度。

  同时,Python提供了一些模块来帮助或简化操作。

  与其他语言相比,例如:C/C ++/Java/Golang,Python确实非常慢。在某些特殊情况下,Python的速度比C ++慢100至200倍

  那么Python慢的原因是什么?

  GIL:全球解释器锁是用于设计计算机程序语言解释器的机制。它在任何时候只能使一个线程执行。Time执行线程。

  吉尔的原因是什么?

  在Python设计的早期阶段,为了避免并发问题,并解决了多线程之间的数据完整性和状态同步的问题,引入了GIL。

  由于使用参考计数器执行Python中对象的管理,因此引用数为0,并且对象已释放。

  例如:两个线程A和B都想引用对象OBJ,并且对象的对象被取消。线程A首先执行取消并减少对象OBJ。在这个时候,OBJ的取消过程也是如此,目前将OBJ减少了。目前,发生了多行音调切换。在这个时光

  在实现多线程线程的过程中,线程将释放GIL以实现CPU和IO的并行执行,因此多线程将大大提高IO强度类型的运行效率。

  测试示例来自攀登北京Xinfaidi价格信息。地址如下:http://www.xinfadi.com.cn/pricedetail.html

  浏览器F12数据包分析,可以看出价格信息是由http://www.xinfadi.com.cn/getpricedata.html获得的。请求方法是发布。我们尝试在首页数据信息的第一页上获取数据,代码如下:

  执行结果如下:

  让我们看一下使用50页蔬菜价格信息的价格:

  为了方便测试,这是运行统计程序运行时间的装饰器。最终单线程代码的代码是:

  运行时间终于是:

  让我们查看多线程时的运行代码:

  最终操作速度提高了约10倍,结果是:

  线程安全性是指在多线程环境中调用时函数和函数库,该环境可以正确处理多个线程的共享变量并使程序函数正确完成

  为了确保线程的安全性,Python提供了两种方法,其中包括这两种方法,这些方法将与某些情况结合起来。

  这是Python专门提供的一种数据。它的特征是将通过先进的第一或高级后输出模式的队列,以确保不会同时通过多个线程访问单个数据。因此,不会引起数据共享冲突。

  此外,使用还可以实现生产者和消费者模型,并在程序之间取消使用,并可以用更少的资源来解决一些高的并发问题。

  一些常见方法:

  在这里,我们将上述爬行动物案例结合在一起,使用队列进行并发分析。总体过程如下:

  首先,更改我们以前的爬行动物程序,并将网页分析和分析网络数据分开分开

  然后写生产者和消费者

  最终结果如下:

  使用锁定时,在执行线程函数之前,它将首先锁定。执行完成后,将释放锁以确保只有一个线程可以占据锁

  以下内容结合了一个经典银行来筹集资金的例子。让我们谈谈为什么它引入锁定

  正常结果的输出应为以下:

  创建两个线程A和B,因此,当A撤回A时,帐户余额将变为200,因此当执行B时,帐户余额不足,因此将提示余额,但是当我们多次运行几次时,我们运行几次几次。此后,您会发现结果将在下面发生:

  这种情况的原因是因为该方法没有线程的安全性。当线程用于修改帐户的余额时,会发生线程开关,即另一个线程b来修改帐户的帐户,因此上述结果的结果出现在上面

  当我们进入代码时,请在添加阻止之前更改余额的逻辑

  您会看到每个操作的结果永远是错误的

  因此,为了解决这个问题,Python引入了相互锁。使用方法如下:

  有两个相应的代码写作,一个是通过尝试...最后...而另一个是通过模式,如下:

  或者

  这是一种与(更简洁使用)一起使用的方法,与上述示例结合在一起:

  无论添加逻辑上的任何阻塞,最终结果都是正确的

  首先了解线程的生命周期,如下图所示:

  从上图,您可以看到,当构建新线程时,系统需要分配资源,并且线程系统的终止需要回收资源。线程池的优势是什么?

  使用方法如下:

  地图的结果和参数的顺序是固定的

  AS_COMPLETED ORDES尚未修复

  以下内容与上述爬行动物案例结合使用。首先

  注意:使用提交时,它是返回的对象,您可以通过获取返回结果。

  使用地图提交任务时,等同于启动线程以同时执行func函数

  应该注意的是,当使用MAP,引入多个参数时,需要传递的变量是迭代对象,例如数组,Yuanzu等,并且参数的数量是一致的。

  如果您不使用关键字来创建线程池,例如,当直接创建线程池时,您需要

  多线程和Coroutine基本上是在单核中执行的,并且多过程使用多进程在多核CPU上并行执行。

  因为多过程和多线程写作方法几乎是相同的,所以这里的解释不多,只有某些创建方法和使用方法。

  关于Coroutine的这一部分,描述了很多内容,因此将其放在下一篇文章中进行学习和介绍。

  最喜欢的朋友可以注意我的公共帐户,微信搜索:feelwow

猜你喜欢