python 8-1 如何使用多线程,Thread创建线程,执行函数赋值给target//类+函数放在run方法中执行
2017-01-28 17:20
1381 查看
python 8-1 如何使用多线程
使用标准库中的threading.Thread创建线程, 在每一个线程中下载并转换一只股票数据
首先python受限于GIL的缘故,多线程只适合IO包括网络IO,磁盘IO,密集型的任务,不适合计算密集型的任务
实现多线程一般有两种方式
第一种:直接将需要执行逻辑部分的函数赋值给target
t = Thread(target=handle,args=(1,))
t.start()
第二种:定义一个自己的类继承Thread,然后将逻辑函数放在run方法中执行
class MyThread(Thread):
def init(self,sid):
self(MyThread,self).init()
self.sid = sid
def run(self):
handle(self.sid)
t=MyThread(1)
t.start()
from threading import Thread
def handle(sid):
print “Download…%d”% sid
url=”http://table.finance.yahoo.com/table.csv?s=%s.sz”
url %=str(sid).rjust(6,’0’)
rf = download(url)
if rf is not None: continue
print ‘Convert to XML …(%d)’ % sid
fname = str(sid).rjust(6,’0’) + ‘.xml’
with open (fname,’wb’) as wf:
createXmlFromCsv(rf,wf)
t = Thread(target=handle,args=(1,))
t.start()
class MyThread(Thread):
def init(self,sid):
self(MyThread,self).init()
self.sid = sid
def run(self):
handle(self.sid)
t=MyThread(1)
t.start()
使用标准库中的threading.Thread创建线程, 在每一个线程中下载并转换一只股票数据
首先python受限于GIL的缘故,多线程只适合IO包括网络IO,磁盘IO,密集型的任务,不适合计算密集型的任务
实现多线程一般有两种方式
第一种:直接将需要执行逻辑部分的函数赋值给target
t = Thread(target=handle,args=(1,))
t.start()
第二种:定义一个自己的类继承Thread,然后将逻辑函数放在run方法中执行
class MyThread(Thread):
def init(self,sid):
self(MyThread,self).init()
self.sid = sid
def run(self):
handle(self.sid)
t=MyThread(1)
t.start()
from threading import Thread
def handle(sid):
print “Download…%d”% sid
url=”http://table.finance.yahoo.com/table.csv?s=%s.sz”
url %=str(sid).rjust(6,’0’)
rf = download(url)
if rf is not None: continue
print ‘Convert to XML …(%d)’ % sid
fname = str(sid).rjust(6,’0’) + ‘.xml’
with open (fname,’wb’) as wf:
createXmlFromCsv(rf,wf)
t = Thread(target=handle,args=(1,))
t.start()
class MyThread(Thread):
def init(self,sid):
self(MyThread,self).init()
self.sid = sid
def run(self):
handle(self.sid)
t=MyThread(1)
t.start()
import csv from xml.etree.ElementTree import Element,ElementTree import requests from StringIO import StringIO from xml.dom.minidom import parse from xml.dom import minidom from test.test_heapq import SideEffectLT from pip._vendor.requests.utils import get_environ_proxies def download(url): proxies = {"http": "http://xx.yy.zz.ww:8000"} response = requests.get(url,proxies=proxies) if response.ok: return StringIO(response.content) def createXmlFromCsv(scsv,fxml): root=minidom.Document() dataElement=root.createElement("Data") reader=csv.reader(scsv) headers=reader.next() headers = map(lambda h: h.replace(' ',''),headers) for row in reader: rowElement=root.createElement("Row") for tag,text in zip(headers,row): item=root.createElement(tag) item.appendChild(root.createTextNode(text)) rowElement.appendChild(item) dataElement.appendChild(rowElement) fxml.write(root.appendChild(dataElement).toprettyxml()) #return root.appendChild(dataElement) if __name__ == '__main__': url = "http://table.finance.yahoo.com/table.csv?s=000001.sz" rf = download(url) if rf: with open("000001.xml",'wb') as wf: createXmlFromCsv(rf,wf) from threading import Thread def handle(sid): print "Download...%d"% sid url="http://table.finance.yahoo.com/table.csv?s=%s.sz" url %=str(sid).rjust(6,'0') rf = download(url) if rf is None: return print 'Convert to XML ...(%d)' % sid fname = str(sid).rjust(6,'0') + '.xml' with open (fname,'wb') as wf: createXmlFromCsv(rf,wf) import time def handle2(sid): print "Counting... %d"%sid for i in [x for x in range(sid)]: time.sleep(0.01) print "Counting done %d"%sid t = Thread(target=handle2,args=(1,)) t.start() class MyThread(Thread): def __init__(self,sid): super(MyThread,self).__init__() self.sid = sid def run(self): handle2(self.sid) t=MyThread(2) t.start() threads = [] for i in xrange(1,11): t = MyThread(i) threads.append(t) t.start() for t in threads: t.join() print "main thread..."
相关文章推荐
- Python使用装饰器和线程限制函数执行时间的方法
- python使用装饰器和线程限制函数执行时间的方法
- 多线程开发要点1:如何使用类的成员函数创建线程
- 当用Thread的子类构造创建多线程时,并同时传入Runnable覆盖run方法时,此时执行的run方法是
- 多线程的使用方法、线程同步、线程状态及相应的一些线程函数用法、概述等。
- C# 多线程开发 1:使用 Thread 类创建与启动线程
- (转载)Qt 的线程与事件循环——可打印threadid进行观察槽函数到底是在哪个线程里执行,学习moveToThread的使用)
- 2-5-Java多线程-创建线程的Runnable接口方法及Thread源码解析
- Android游戏开发:如何利用Thread与Handler执行多线程的方法
- [Android] 如何在 Fragment 中使用 runOnUiThread() 方法
- 关于在子线程中在run方法执行完之后通知主线程进行操作的方法。(Toast在子线程中无法使用)
- 线程 创建和启动线程的两种方式 实现Runnable接口 继承Thread类 重写唯一方法run()
- java并发编程---如何创建线程以及Thread类的使用
- JAVA之旅(十二)——Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口
- 多线程Thread与后台线程setDaemon,使用Runnable接口创建多线程
- python 8-4 如何使用线程本地数据,threading.local函数可以创建线程本地数据空间,属性对每个线程独立存在
- [C#学习笔记之多线程1]使用ParameterizedThreadStart委托向线程函数传送参数
- java多线程编程之使用thread类创建线程
- JAVA之旅(十二)——Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口
- JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没