使用线程的不需要的结果

时间:2015-04-10 22:05:03

标签: python multithreading python-2.7 pandas

我正在努力理解threading,但我想我只是在困惑自己。 我有一个使用第三方API的Emmys类。在课程中,我使用create_data方法查询数据库并创建Pandas DataFrame,然后我加入另一个DataFrame

该课程如下:

import inro.emme.database.emmebank as _bank
from pandas import DataFrame
import numpy as np

class Emmys(object):
    def __init__(self):
        self.df = DataFrame(data=np.arange(24), columns=["Hour"])

    def create_data(self,path,names):
        d = []
        columns = ["Hour"]
        columns.extend(names)
        with _bank.Emmebank(path) as bank:
            for scenario in bank.scenarios():
                if 2000 <= scenario.number < 3000:
                    vmt = []
                    vht = []
                    hour =  int(bank.scenario(scenario.number).title.split()[1].split("-")[0])    
                    network_links = bank.scenario(scenario.number).get_network().links()            
                    for link in network_links:
                        if 1 <= link.volume_delay_func <= 9: 
                            vmt.append(link.length * link.auto_volume)
                            vht.append((link.auto_time/60) * link.auto_volume)
                    d.append([hour,sum(vmt),sum(vht)])  
            temp =  DataFrame(d,columns=columns)
            self.df = DataFrame.merge(self.df, temp, how="left", on="Hour")

要调用create_data方法,我已经创建了threading和常规方法。

线程方法

from threading import Thread
from datetime import datetime

startTime = datetime.now()
e1 = Emmys()
p1 = "I:/ModServStaff/1/emmebank"
p2 = "I:/ModServStaff/2/emmebank"
t1 = Thread(target=e1.create_data, args=(p1,["VMT_PS","VHT_PS"]))
t2 = Thread(target=e1.create_data, args=(p2,["VMT_NPS","VHT_NPS"]))
t1.start()
t2.start()
t1.join()
t2.join()
print datetime.now() - startTime 
# 0:04:51.103000 minutes to run

常规方法

startTime = datetime.now()
e = Emmys()
path = "I:/ModServStaff/1/emmebank"
e.create_data(path,["VMT_PS","VHT_PS"])
path = "I:/ModServStaff/2/emmebank"
e.create_data(path,["VMT_NPS","VHT_NPS"])
print datetime.now() - startTime 
#0:01:51.793000 minutes to run

我得到两个不同的结果

使用我的e1(线程),我得到以下DataFrame

e1.df.head()
    Hour    VMT_NPS         VHT_NPS
0   0       372340.128855   8427.114585
1   1       253214.489522   5640.123767
2   2       227031.655104   5062.068237
3   3       245598.203502   5473.983267
4   4       348784.430498   7787.368914

使用e对象(使用常规方法)我得到:

e.df.head()
    Hour    VMT_PS          VHT_PS          VMT_NPS         VHT_NPS
0   0       372340.128855   8427.114585     372340.128855   8427.114585
1   1       253214.489522   5640.123767     253214.489522   5640.123767
2   2       227031.655104   5062.068237     227031.655104   5062.068237
3   3       245598.203502   5473.983267     245598.203502   5473.983267
4   4       348784.430498   7787.368914     348784.430498   7787.368914

使用常规方法,我得到了我想要的DataFrame。我的threading方法仅返回_NPS列,这有什么问题?以及为什么threading方法需要更长时间才能运行?我认为常规方法会更快。

0 个答案:

没有答案