我正在尝试使用autodesk的fbx python模块,但我似乎无法对任何操作进行线程处理。这似乎是由于GIL没有重新发布。有没有人发现了同样的问题,或者我做错了什么?当我说它不工作时,我的意思是代码不会释放线程,当fbx代码运行时,我不能做任何其他事情。
没有太多的代码可以发布,只是为了知道是否有人尝试过它。
更新:
这是示例代码,请注意每个fbx文件大约是2 2GB
import os
import fbx
import threading
file_dir = r'../fbxfiles'
def parse_fbx(filepath):
print '-' * (len(filepath) + 9)
print 'parsing:', filepath
manager = fbx.FbxManager.Create()
importer = fbx.FbxImporter.Create(manager, '')
status = importer.Initialize(filepath)
if not status:
raise IOError()
scene = fbx.FbxScene.Create(manager, '')
importer.Import(scene)
# freeup memory
rootNode = scene.GetRootNode()
def traverse(node):
print node.GetName()
for i in range(0, node.GetChildCount()):
child = node.GetChild(i)
traverse(child)
# RUN
traverse(rootNode)
importer.Destroy()
manager.Destroy()
files = os.listdir(file_dir)
tt = []
for file_ in files:
filepath = os.path.join(file_dir, file_)
t = threading.Thread(target=parse_fbx, args=(filepath,))
tt.append(t)
t.start()发布于 2016-11-19 03:29:15
我看到的一个问题是您的traverse()函数。它以递归的方式调用自己,可能会有大量的次数。另一种是让所有线程同时打印内容。正确地做到这一点需要协调对共享输出设备(即屏幕)的访问。一种简单的方法是创建并使用全局threading.Lock对象。
首先创建一个全局Lock,以防止线程同时打印:
file_dir = '../fbxfiles' # an "r" prefix needed only when path contains backslashes
print_lock = threading.Lock() # add this here然后创建一个使用它的traverse()的非递归版本:
def traverse(rootNode):
with print_lock:
print rootNode.GetName()
for i in range(node.GetChildCount()):
child = node.GetChild(i)
with print_lock:
print child.GetName()我不清楚读取每个fbxfile的确切位置。如果这一切都是由于importer.Import(scene)调用而发生的,那么除非在traverse()函数中还执行了一些I/O操作,否则这将是其他线程唯一有机会运行的时候。
由于打印绝对是输出的一种形式,因此线程切换也可以在打印完成时发生。然而,如果函数所做的只是执行某种类型的计算,那么在其执行过程中就不会在其内部发生多线程。
一旦你得到了多读的工作,你可能会遇到内存不足的问题,如果多个2 2GB的may文件被不同的线程同时读入内存。
https://stackoverflow.com/questions/40661284
复制相似问题