首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Autodesk的Fbx Python和线程

Autodesk的Fbx Python和线程
EN

Stack Overflow用户
提问于 2016-11-18 01:23:22
回答 1查看 364关注 0票数 1

我正在尝试使用autodesk的fbx python模块,但我似乎无法对任何操作进行线程处理。这似乎是由于GIL没有重新发布。有没有人发现了同样的问题,或者我做错了什么?当我说它不工作时,我的意思是代码不会释放线程,当fbx代码运行时,我不能做任何其他事情。

没有太多的代码可以发布,只是为了知道是否有人尝试过它。

更新:

这是示例代码,请注意每个fbx文件大约是2 2GB

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2016-11-19 03:29:15

我看到的一个问题是您的traverse()函数。它以递归的方式调用自己,可能会有大量的次数。另一种是让所有线程同时打印内容。正确地做到这一点需要协调对共享输出设备(即屏幕)的访问。一种简单的方法是创建并使用全局threading.Lock对象。

首先创建一个全局Lock,以防止线程同时打印:

代码语言:javascript
复制
file_dir = '../fbxfiles'  # an "r" prefix needed only when path contains backslashes
print_lock = threading.Lock()  # add this here

然后创建一个使用它的traverse()的非递归版本:

代码语言:javascript
复制
    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文件被不同的线程同时读入内存。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40661284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档