您的位置:首页 > 编程语言 > Python开发

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()

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..."
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐