Python openpyxl线程安全?
openpyxl线程安全吗? 我希望有一个线程更改工作表,而另一个线程定期保存。我想知道是否需要在更改和保存操作周围添加一个锁对象,或者这是否已经内置到openpyxl中。我在文档中没有看到任何内容,也没有看到任何关于openpyxl中线程的问题 阅读您的答案后,我进行了以下测试:Python openpyxl线程安全?,python,thread-safety,openpyxl,Python,Thread Safety,Openpyxl,openpyxl线程安全吗? 我希望有一个线程更改工作表,而另一个线程定期保存。我想知道是否需要在更改和保存操作周围添加一个锁对象,或者这是否已经内置到openpyxl中。我在文档中没有看到任何内容,也没有看到任何关于openpyxl中线程的问题 阅读您的答案后,我进行了以下测试: import threading import random import time from openpyxl import Workbook wb = Workbook() class openpyx
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()
这给了我以下的旅行包:
我决定看看是否可以测试一下,所以我创建了下面的简单程序,它生成了一组线程,这些线程尝试读取和写入同一个单元格,并加入了随机休眠 我没有看到任何可能表明存在问题的操作系统错误。另一方面,我确实看到了一些我不太理解的行为。随着线程数的增加,完成的循环数减少。例如,线程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()
“OpenPyXl是线程安全的;工作簿可以由
不同的线程。但是,每个工作簿只能由
一次一根线。”
表单基于您对openpyxl 1.5.8的实验。。。读写是线程安全的,但不是完全并发的。也就是说,没有错误,但随着线程数的增加,每个线程的性能会降低。但是,保存操作不是线程安全的。如果在保存操作期间有写入操作,则保存操作将崩溃。这是一个好主意,但我尝试复制它(请参阅上面更新的应用程序),但无法使其崩溃。告诉我该链接的访问被拒绝。我个人感兴趣的是每张纸上都有一个线程,因为我正在填写一张10多页的来自IO绑定源的纸。