openpyxl线程安全吗?

时间:2012-06-27 20:16:25

标签: python thread-safety openpyxl

openpyxl线程安全吗? 我希望有一个线程更改工作表,而另一个线程定期保存。我想知道是否需要在更改和保存操作周围添加锁定对象,或者是否已经内置到openpyxl中。我没有在文档中看到任何内容,也没有在openpyxl中看到任何关于线程的问题。

在阅读完答案后,我进行了以下测试:

import threading 
import random 
import time 
from openpyxl import Workbook

wb = Workbook() 

class openpyxlwriting ( threading.Thread): 

    def run ( self ): 

        global wb
        ws = wb.get_active_sheet()
        c = 1 
        for a in range(100):
            for b in range(10000):
                ws.cell(column = a,row=b).value = c
                c += 1
            print "row ",a

class openpyxlsaving ( threading.Thread): 

    def run ( self ): 

        global wb

        for a in range(1000): 
            wb.save('test.xlsx')
            print "saved"

openpyxlwriting().start()
time.sleep(1)
openpyxlsaving ().start()

给了我以下trasback: trasback.png

2 个答案:

答案 0 :(得分:2)

我决定看看我是否可以测试这个,所以我在下面创建了一个简单的程序,它生成了一堆线程,试图读取和写入相同的单元格,并随机输入睡眠。

我没有看到任何可能表示存在问题的操作系统错误。另一方面,我确实看到了一些我不太了解的行为。随着线程数增加,完成的循环次数减少。因此,例如,线程100仅完成了8次遍历循环。这可能是我的某种错误,或者它可能表明线程安全存在问题。

无论如何,如果你有这种倾向,这应该让你自己开始测试它。

import threading
import random
import time
from openpyxl import Workbook

wb = Workbook()
ws = wb.get_active_sheet()
testcell = ws.cell('B9')
counter = 1

class openpyxlworker ( threading.Thread):

    def run ( self ):

        global wb     
        global testcell
        global counter

        for a in range(1000):
            time.sleep(random.random()/100)
            writing = random.randrange(1, 1000)
            testcell.value = writing
            time.sleep(random.random()/100)
            reading = testcell.value          
            print "Thread " + str(counter) + " wrote " + str(writing) + " and read " + str(reading)
            time.sleep(random.random()/100)
            wb.save('test.xlsx')

        counter = counter + 1

for b in range(100):
    openpyxlworker().start()

答案 1 :(得分:2)

  

" OpenPyXl是线程安全的;工作簿可以同时创建   不同的线程。但是,每个工作簿只能通过修改   一次一个线程。"

表格https://bitbucket.org/openpyxl/openpyxl/issues/228/