我对python相当陌生,正在制作一个脚本,允许将其他程序的点云数据导入Autodesk Maya。我的脚本运行良好,但我想要做的是让它更快。我有一个循环遍历编号文件的列表。即datafile001.txt,datafile002.txt等。我想知道的是,是否有办法让它一次执行多个,可能使用线程或队列?下面我的代码我一直在努力:Python - 使用线程或队列遍历调用函数的for循环
def threadedFuntion(args):
if len(sourceFiles) > 3:
for count, item in enumerate(sourceFiles):
t1=Thread(target=convertPcToPdc,args=(sourceFiles[filenumber1], particlesName, startframe, endframe, pdcIncrements, outputDirectory, variableFolder, acceptableArrayforms, dataType))
t1.start()
t2=Thread(target=convertPcToPdc,args=(sourceFiles[filenumber2], particlesName, startframe, endframe, pdcIncrements, outputDirectory, variableFolder, acceptableArrayforms, dataType))
t2.start()
t3=Thread(target=convertPcToPdc,args=(sourceFiles[filenumber3], particlesName, startframe, endframe, pdcIncrements, outputDirectory, variableFolder, acceptableArrayforms, dataType))
t3.start()
t4=Thread(target=convertPcToPdc,args=(sourceFiles[filenumber4], particlesName, startframe, endframe, pdcIncrements, outputDirectory, variableFolder, acceptableArrayforms, dataType))
t4.start()
这显然是有很多原因不能正常工作,首先它只是将创建4个线程,我希望能够给一个选项,更或更少。其次它错误,因为它试图重用一个线程?就像我说的,我对python很陌生,而且头脑微微一点,我在这里看过几篇文章,但无法让其工作得很好。我认为队列可能是我需要的东西,但无法弄清楚,我尝试了条件语句和加入语句,但再次无法得到我想要的。
我想更具体什么我想实现的是,该函数是通过文本文件读取,检索coords,然后将它们导出为二进制文件供maya读取。这些文本文件中的一个具有5-10百万个x,y,z坐标,这很常见,这需要相当长的时间。大约需要30分钟 - 1小时的时间在一台漂亮的兽人电脑上做1个文件,任务管理器说python只使用12%的处理器和大约1%的RAM,所以如果我可以同时做多个这样的文件,更多文件的速度要快很多。我不认为多线程/排队for循环很难,但我已经迷路了,并且尝试了一周左右的失败解决方案。
谢谢大家的帮助,我真的很感激,并认为这个网站是惊人的。这是我的第一篇文章,但我觉得我只是从阅读这里完全学会了Python。
如果您的任务是IO绑定的(程序花费大部分时间等待磁盘中的数据),那么添加竞争光盘访问的线程将无助于提高性能。如果任务是CPU限制的(程序处理数据的速度比磁盘能够提供的速度慢),那么在您的情况下,如果您有多个CPU,则可以使用多处理模块来处理不同进程中的文件。@ CaptainMurthy的例子应该像现在一样工作,如果你删除'线程'名称并使用'从多处理导入进程,锁'代替 – jfs