2016-09-30 49 views
0

我有一些代码很好地工作。这是一个通过日期列表的while循环,在我的硬盘上找到与这些日期相对应的文件,对这些文件进行一些计算,然后使用以下命令输出到“results.csv”文件:蟒蛇,多线程,安全地使用普通文件上的熊猫“to_csv”?

my_df.to_csv("results.csv",mode = 'a') 

我想知道是否可以安全地为每个日期创建一个新的线程,并在几个日期一次调用while循环中的东西?

我的代码:

import datetime, time, os 
import sys 
import threading 
import helperPY #a python file containing the logic I need 

class myThread (threading.Thread): 
    def __init__(self, threadID, name, counter,sn, m_date): 
     threading.Thread.__init__(self) 
     self.threadID = threadID 
     self.name = name 
     self.counter = counter 
     self.sn = sn 
     self.m_date = m_date 
    def run(self): 
     print "Starting " + self.name 
     m_runThis(sn, m_date) 
     print "Exiting " + self.name 

def m_runThis(sn, m_date): 
    helperPY.helpFn(sn,m_date) #this is where the "my_df.to_csv()" is called 

sn = 'XXXXXX' 
today=datetime.datetime(2016,9,22) # 
yesterday=datetime.datetime(2016,6,13) 

threadList = [] 
i_threadlist=0 
while(today>yesterday): 
    threadList.append(myThread(i_threadlist, str(today), i_threadlist,sn,today)) 
    threadList[i_threadlist].start() 
    i_threadlist = i_threadlist +1 
    today = today-datetime.timedelta(1) 

回答

1

写在多线程的文件是不是安全。但是您可以创建lock来保护这一个操作,同时让其他操作平行运行。您to_csv没有显示,但你可以创建锁

csv_output_lock = threading.Lock() 

,并把它传递给helperPY.helpFn。当你的操作,做

with csv_output_lock: 
    my_df.to_csv("results.csv",mode = 'a') 

你得到并行进行其他操作 - 服从当然GIL - 但该文件的访问是受保护的。

+0

我必须在调用helperFn()之前/之后获取/释放锁吗? –

+1

如果你使用'with'子句进行操作,则锁定在进入该模块时获取,并在退出时自动释放。但是,只有当它只包装了一些代码时,锁才有用。如果你所有的工作都是在'helperFn'内完成的,并且你锁定了'helperFn'的全部内容,那么你已经击败了该池的任何优势。 – tdelaney

+0

理论上这是不安全的,但实际上Python的线程受到全局解释器锁定的限制。除非代码偏离到释放这个锁的C扩展,否则即使线程模块也在排队,我相信这应该使IO安全。意见? – Mai