python如何多线程处理数据_多线程使用

python如何多线程处理数据_多线程使用python多线程 – 线程间通信(全局变量、queue)简介什么是线程间通信呢?为什么要通信?1、共享变量(全局变量)线程间通过共享同一个全局变量进程通讯最简单的想法是建立一个

python多线程 – 线程间通信(全局变量、queue)   简介   什么是线程间通信呢?   为什么要通信?   1、共享变量(全局变量)   线程间通过共享同一个全局变量进程通讯   最简单的想法是建立一个全局变量。几个子线程共同操作这个全局变量(几个线程写变量,几个线程读变量)   举爬虫的例子,假设需要爬取博客网站的所有文章详情,先要通过文章列表页爬取所有文章的,再根据文章的,爬取文章的具体内容。一般来说,爬取文章的速度比较快,因为文章内容数据量相对更大,速度要慢一些,所以可以用一个 线程A 爬取文章列表,多个线程 B 根据访问文章具体内容并爬取。此时两个线程之间有交互,文章内容爬取线程B需要得到文章列表爬取线程A的具体数据,而线程A(文章列表爬取)无需线程B(文章内容爬取)的数据。   看起来结果很完美,但是,存在着一定的隐患,虽然一般很慢暴露出来。   有两个问题: 的不是线程安全的,可能函数执行到了一半,另一个线程同时执行,或者另一个线程执行,这个时候中的数据就会发生错误,导致程序挂掉或者得到不正确的结果。假设中只有一个素,当一个线程判断列表不为空,还没有出数据时,时间片被另一个线程抢走,同样列表中还有素,同样不为空,成功的把数据取出来,这时列表就为空了,这时时间片又让给了上一个线程,上一个线程执行,导致的异常!在语句前加上可以暴露出这个问题。   因为多个线程是共享进程的空间的,所以线程之间的通信比较简单,主要是利用全局变量的方法。全局变量对进程内的的所有线程都是可见的,所以多个线程可以通过操作全局变量达到相互通信的效果。但是这也存在一个问题,就是“资源”的竞争。   这里所说的资源指的就是全局变量,正是因为这种竞争(因为多线程是同时运行的,而我们往往不会去控制线程运行的顺序,不然也不会用多线程了),导致可一些我们不愿见到的结果,所以我们每个线程对全局变量的操作都希望是原子性的。   为了解决这个问题在线程见引入了三种同步互斥机制,分别是信号量,互斥锁,条件变量。 2、通过消息队列–queue模块   使用消息队列的过程和上面一样,只不过进行了很好的封装,在放值和取值的时候时线程安全的。   模块实现了多生产者,多消费者的队列。当 要求信息必须在多线程间安全交换,这个模块在线程编程时非常有用 。里面主要实现了3中队列。  class queue.Queue(maxsize = 0): 构造一个FIFO队列,maxsize可以限制队列的大小。如果队列的大小达到了队列的上限,就会加锁,加入就会阻塞,直到队列的内容被消费掉。maxsize的值小于等于0,那么队列的尺寸就是无限制的class queue.LifoQueue(maxsize = 0): 构造一个LIFO(Last In First Out)队列class PriorityQueue(maxsize = 0):优先级最低的先出去,优先级最低的一般使用sorted(list(entries))[0]。典型加入的素是一个祖(优先级, 数据)   使用queue重写之前的代码:   总结   线程间需要通信,使用全局变量需要加锁。使用模块,可在线程间进行通信,并保证了线程安全。

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/69441.html

(0)
上一篇 2024年 8月 7日 下午9:47
下一篇 2024年 8月 7日

相关推荐

关注微信