python 8-4 如何使用线程本地数据,threading.local函数可以创建线程本地数据空间,属性对每个线程独立存在
2017-01-28 17:32
1046 查看
8-4 如何使用线程本地数据
解决方案:
threading.local函数可以创建线程本地数据空间,其下属性对每个线程独立存在,
比如如下例子,l.x是主线程的local 变量
在线程 t 中调用红f 去访问就报错了说找不到这个变量了
l = threading.local()
l.x = 0
import threading
l = threading.local()
l.x = 5
print l.x
5
def f():
… print l.x
…
f()
5
t = threading.Thread(target=f,args=())
t.start
解决方案:
threading.local函数可以创建线程本地数据空间,其下属性对每个线程独立存在,
比如如下例子,l.x是主线程的local 变量
在线程 t 中调用红f 去访问就报错了说找不到这个变量了
l = threading.local()
l.x = 0
import threading
l = threading.local()
l.x = 5
print l.x
5
def f():
… print l.x
…
f()
5
t = threading.Thread(target=f,args=())
t.start
import numpy import cv2 import os,cv2,time,struct,threading from BaseHTTPServer import HTTPServer,BaseHTTPRequestHandler from SocketServer import TCPServer,ThreadingTCPServer from threading import Thread,RLock from select import select class JpegStreamer(Thread): def __init__(self,camera): Thread.__init__(self) self.cap = cv2.VideoCapture(camera) print "self.cap is ",self.cap self.lock = RLock() self.pipes = {} def register(self): pr,pw = os.pipe() self.lock.acquire() self.pipes[pr] = pw self.lock.release() return pr def unregister(self,pr): self.lock.acquire() self.pipes.pop(pr) self.lock.release() pr.close() pw.close() def capture(self): cap = self.cap print "cap.isOpened()",cap.isOpened() while cap.isOpened(): print "frame is " print "ret is " ret, frame = cap.read() print "frame is ",frame print "ret is ",ret if ret: ret, data = cv2.imencode('.jpeg',frame,(cv2.IMWRITE_JPEG_QUALITY,40)) yield data.tostring() def send(self,frame): n = struct.pack('l',len(frame)) self.lock.acquire() if len(self.pipes): _,pipes = select([],self.pipes.itervalues(),[],1) for pip in pipes: os.write(pip.n) os.write(pip,frame) self.lock.release() def run(self): for frame in self.capture(): self.send(frame) class JpegRetriever(object): def __init__(self,streamer): self.streamer = streamer self.local = threading.local() #self.pipe = streamer.register() def retrieve(self): while True: ns = os.read(self.pipe,8) n = struct.unpack('l',ns)[0] data = os.read(self.pipe,n) yield data def __enter__(self): if hasattr(self.local,'pip'): raise RuntimeError self.local.pipe = streamer.register() return self.retrieve() def cleanup(self): self.streamer.unregister(self.pipe) def __exit__(self,*args): self.streamer.unregister(self.local.pip) del self.local.pipe class Handler(BaseHTTPRequestHandler): retriever = None @staticmethod def setJpegRetriever(retriever): Handler.retriever = retriever def do_GET(self): print "self.path is ",self.path if self.retriever is None: raise RuntimeError("no retriever") if self.path != '/': return self.send_response(200) self.send_header("Content-type",'multipart/x-mixed-replace;boundary=abcde') self.end_headers() with self.retriever as frames: for frame in frames: print "frame is coming..." self.send_frame(frame) def send_frame(self,frame): print "xxxxx" self.wfile.write('--abcde\r\n') self.wfile.write('Content-Type: image/jpeg/\r\n') self.wfile.write('Content-Length :%d\r\n\r\n' % len(framce)) self.wfile.write(frame) if __name__ == '__main__': streamer = JpegStreamer(0) streamer.start() retriever = JpegRetriever(streamer) Handler.setJpegRetriever(retriever) print "starting server..." httpd = ThreadingTCPServer(('',9003),Handler) httpd.serve_forever()
相关文章推荐
- Python 创建线程本地数据
- 如何创建一个可以保存13亿数据的数组?兼谈时间和空间之间永无休止的战争
- python 8-1 如何使用多线程,Thread创建线程,执行函数赋值给target//类+函数放在run方法中执行
- VS2003 C#:重写键盘响应事件、动态创建控件、创建线程、在线程中使用委托在界面显示数据
- 应用程序中的所有线程都可以访问方法中的公用字段。要同步对公用字段的访问,您可以使用属性替代字段,并使用 ReaderWriterLock 对象控制访问。为此,请按照下列步骤操作:
- 如何使用动态创建模板列并绑定数据(GridView,Repeater,DataGrid)
- Entity Framework 4.1 DbContext使用记之二——如何玩转本地实体? DbSet.Local属性的使用与实现
- 在 Windows 7 下如何使用 native c++ 正确创建线程
- VirtualBox虚拟 Ubuntu时如何使用共享数据空间
- javascript 中的 prototype和constructor属性的使用(constructor属性始终指向创建当前对象的构造函数,每个函数都有一个默认的属性prototype,而这个prototype的constructor默认指向这个函数)
- WPF中如何使用C#创建DataTemplate数据模版
- 读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。【轉】
- 如何使用VC创建一个ActiveX控件,并使其可以被VB使用
- 如何使用数据查询的Parameters中的output属性取的返回值
- 读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。
- Entity Framework 4.1 DbContext使用记之二——如何玩转本地实体? DbSet.Local属性的使用与实现
- net控件中数据导到Excel的格式 首先,我们了解一下excel从web页面上导出的原理。当我们把这些数据发送到客户端时,我们想让客户端程序(浏览器)以excel的格式读取它,所以把mime类型设为:application/vnd.ms-excel,当excel读取文件时会以每个cell的格式呈现数据,如果cell没有规定的格式,则excel会以默认的格式去呈现该cell的数据。这样就给我们提供了自定义数据格式的空间,当然我们必须使用excel支持的格式。下面就列出常用的一些格式: 1) 文本
- 在使用exp/imp时如何实现导入数据到指定的表空间
- 利用ATL创建com组件和如何在程序中使用组件的接口函数和设置接口的属性
- SQL2008如何使用空间工具(Spatial Tools)导入ESRI格式地图数据的示例