我有数据通过套接字进入,排队等待解析并检查某些要求,然后传递给我的FileWrite()函数。
即使数据水平相当均匀,它似乎会随着时间的推移而减速。我似乎无法找到它的泄漏或它需要这么长时间的原因。
这是代码的片段。它会在列表中向后移动,因为它还会进行快速检查,以确保它值得写入,并且可能偶尔会从列表中弹出一些内容但是我没有它就会运行定时器而且它没有#39; t有所作为。
段:
def FileWrite():
CopiedList = []
del CopiedList[:]
CopiedList[:] = []
CopiedList = list(ListForMatches)
try:
if os.path.exists("Temp.xml") == True:
os.remove("Temp.xml")
if os.path.exists("Finished.xml") == True:
os.remove("Finished.xml")
try:
if os.path.exists("Temp.xml") == True:
try:
os.remove("Temp.xml")
except:
print "problem removing temp.xml?"
root = ET.Element("Refunds")
tree = ET.ElementTree(root)
for Events in reversed(CopiedList):
try:
XMLdataparse2 = []
del XMLdataparse2[:]
XMLdataparse2[:] = []
XMLdataparse2 = Events.split('-Delimeter_Here-')
try:
if "Snowboarding" in XMLdataparse2[0]: #Football
matches = ET.SubElement(root, "Event", type = XMLdataparse2[0])
ET.SubElement(matches, "EventTime").text = str(XMLdataparse2[1])
ET.SubElement(matches, "EventName").text = str(XMLdataparse2[2])
ET.SubElement(matches, "Location").text = str(XMLdataparse2[3])
ET.SubElement(matches, "Distance").text = str(XMLdataparse2[4])
except:
print "problem preparing XML tree"
except:
agecounter = agecounter - 1 #Prevent infinite loop in case of problem
print "Problem moving to next XML tree"
trry = 0 #Attempts writing the XML file a few times (just in case)
while trry < 5:
try:
tree.write("Temp.xml")
break
except:
trry +=1
except:
print "problem writing XML file"
e = sys.exc_info()[0]
print e
#except:
except WindowsError, e:
e = sys.exc_info()[0]
print e
#Let's get the file ready to go.
try:
if os.path.exists("Temp.xml") == True:
os.rename("Temp.xml","Finished.xml")
except:
print "Problem creating Finished.xml"
return
我的问题是可以通过&#39; -Delimeter_Here - &#39;安全地传递解析。并将XML文件写入线程。如果我要添加200个,那么200个线程可以解析那些数据并安全地将它们写入同一个文件,或者这会造成各种各样的破坏吗?
我无法真正看到另一种消除这一瓶颈的方法,但我很感激任何建议或安全的方法来解决这个问题。
更新
所以我一直在读书并做一些测试。怀疑证实,让多个线程同时写入XML是不安全的。
理论上我可以通过分隔线程中的分隔符来拆分列表,这会阻止一个线程不必这样做。我不知道如何从这些线程中将字符串写入XML。我不知道如何将它们添加到另一个队列,而无需再解析它们。
也许是一个函数,它会将一组字符串写入XML并尝试将此文件锁定为线程库的一部分。
因此,对于最后一个结果,一个线程首先分割数据并在将数据传递给另一个线程函数时将其检查,然后将其写入XML,一次锁定一个。
我希望线程可以等到锁定关闭并以此方式旋转。
更新
我使用线程编写它来解析字符串和文件锁定以防止它变慢。这是我看到加快这一点的唯一方法。在没有经常解析XML的情况下正确更新文件时遇到一些麻烦,这是一个更大的减速(发布here)。
我无法想到加快这种情况的其他任何方式。