python 线程之 数据同步 Queue
Queue:将数据从一个线程发往另外一个线程比较通用的方式是使用queue模块的Queue类
1, 首先创建一个Queue模块的对象,创建Queue对象可以传递maxsize也可以不传递
2. 使用对象的put和get函数用来添加和移除元素。
import _thread
import queue
import time consumercount = 2
producercount = 4
nummessages = 4 safeprint = _thread.allocate_lock()
dataQueue = queue.Queue() def producer(idnum):
for msgnum in range(nummessages):
time.sleep(idnum)
dataQueue.put('producer id = {0},count={1}'.format(idnum, msgnum)) def consumer(idnum):
while True:
time.sleep(0.1)
try:
data = dataQueue.get(block=False)
except queue.Empty:
pass
else:
with safeprint:
print('consumer id = {0}, got => {1}'.format(idnum, data)) if __name__ == "__main__":
for i in range(producercount):
_thread.start_new_thread(producer, (i,))
for i in range(consumercount):
_thread.start_new_thread(consumer, (i,))
time.sleep(10)
print('main process existing')
在调用get的方法时,如果设置block为True,那么队列为空的时候调用get方法,会使调用线程阻塞。
当使用队列,如何对生产者和消费者的关闭过程进行同步。一般情况下使用一个特殊的终止值,当将这个值放入队列时消费者线程退出
import queue
import time
import threading _sentinel = object()
dataQueue = queue.Queue() def producer(out_q):
n = 0
while n < 10:
n += 1
dataQueue.put('input {0}'.format(n)) dataQueue.put(_sentinel) def consumer(in_q):
while True:
data = in_q.get(block=False)
if data is _sentinel:
in_q.put(_sentinel)
break
print(data)
time.sleep(1) threading.Thread(target=producer, args=(dataQueue,)).start()
threading.Thread(target=consumer, args=(dataQueue,)).start()
在这个实例中,当消费者接收到这个特殊的终止值后,会立刻将其重新放回到队列中,这么做使得在同一队列上监听其他消费者线程也能接收到终止值。因此可以一个一个地将他们都关闭掉。
Queue为线程安全的类型,所以在添加和移除的过程中会自动获取所需的锁。
python 线程之 数据同步 Queue的更多相关文章
- 获取其他线程的数据用 queue, 多进程Q
获取其他线程的数据用 queue, 多进程Q
- python线程中的同步问题
多线程开发可能遇到的问题 假设两个线程t1和t2都要对num=0进行增1运算,t1和t2都各对num修改1000000次,num的最终的结果应该为2000000.但是由于是多线程访问,有可能出现下面情 ...
- Python线程优先级队列(Queue)
Python的Queue模块中提供了同步的.线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列 LifoQueue,和优先级队列PriorityQueue.这些队列都实 ...
- 线程安全、数据同步之 synchronized 与 Lock
本文Demo下载传送门 写在前面 本篇文章讲的东西都是Android开源网络框架NoHttp的核心点,当然线程.多线程.数据安全这是Java中就有的,为了运行快我们用一个Java项目来讲解. 为什么要 ...
- java线程基础巩固---数据同步引入并结合jconsole,jstack以及汇编指令认识synchronized关键字
对于多线程编程而言其实老生成谈的就是数据同步问题,接下来就会开始接触这块的东东,比较麻烦,但是也是非常重要,所以按部就班的一点点去专研它,下面开始. 数据同步引入: 这里用之前写过的银行叫号的功能做为 ...
- linux下数据同步、回写机制分析
一.前言在linux2.6.32之前,linux下数据同步是基于pdflush线程机制来实现的,在linux2.6.32以上的版本,内核彻底删掉了pdflush机制,改为了基于per-bdi线程来实现 ...
- PYTHON线程知识再研习F---队列同步Queue
让我们考虑更复杂的一种场景:产品是各不相同的.这时只记录一个数量就不够了,还需要记录每个产品的细节.很容易想到需要用一个容器将这些产品记录下来. Python的Queue模块中提供了同步的.线程安全的 ...
- python 守护进程、同步锁、信号量、事件、进程通信Queue
一.守护进程 1.主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes ...
- python线程+队列(queue)
---恢复内容开始--- python的线程学习 用处 pocpiliang脚本的编写 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程.语法如下: _thr ...
随机推荐
- myeclipse给项目改了名字,但部署tomcat的项目名还是原来的
如标题所示: 在myeclipse中按F2改了项目名称,之前在tomcat中部署的名称是另一个,再次重新部署,永远是上一个的旧名称 解决办法: 项目点右键-properties-左上角搜索框输入web ...
- Formal Definitions Using ASN.1 - SNMP Tutorial
30.7 Formal Definitions Using ASN.1 The SMI standard specifies that all MIB variables must be define ...
- 配置struts2+spring,springmvc
Struts2+Spring整合 一.spring负责注入,struts2负责它自己的工作.这样不是很符合spring作为ioc容器的全部功能,不推荐. 二.spring负责全部bean和struts ...
- 搬家到cnblogs
从openshift搬到LOFTER再到点点然后来cnblogs,晃悠一大圈,主要是没时间学习很多东西,再加上cnblogs的搜索收录情况比较好一点(百 度搜索).另外听闻百度空间bye-bye了,以 ...
- 如何将EXCEL表导入ORACLE数据库中?【转】
来源:https://zhidao.baidu.com/question/383828330.html?qbl=relate_question_2&word=excel%20%B1%ED%CA ...
- UICollectionView
#import "ViewController.h" @interfaceViewController ()<UICollectionViewDataSource,UICol ...
- 如何刷新或清除HttpURLConnection的连接缓存
项目需要定期与远程服务器同步数据,基于如下代码: URL url = new URL("http://test.com/sales/info"); connection = (Ht ...
- Daily Build
Daily Build 是一件非常有意义的事情,也是敏捷开发中关于 “持续集成” 的一个实践.Daily Build 对于开发来说有如下好处: 保证了每次 check in 的代码可用,不会造成整个工 ...
- seajs源码分析
seajs主要做了2件事 1.定义什么是模块,如何声明模块:id.deps.factory.exports ----define=function(id,deps,factory){return ex ...
- javascript的document中的动态添加标签
document的高级篇中提供了节点操作的函数,具体包括:获取节点,改变节点,删除节点,替换节点,创建节点,添加节点,克隆节点等函数.我们可以利用这些函数动态改变html的节点. 1.JavaScri ...