Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5119965
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类: Python/Ruby

2012-04-18 14:47:18

 
lukeiamyourfather在上面共享了他的Multithreaded Mesh Proces脚本,这个脚本是用来实现realflow的多线程输出mesh,虽然realflow的nogui模式有"-threads"这个参数,但你会发现即使你指定了"n"个线程,也是没什么不同的,不管是版4还是版本5,lukeiamyourfather的这个脚本很好的解决了这个问题,他把真正的多线程引入到了realflow的mesh输出。
但是他这个脚本是基于python 3.x来写的,你必须使用python 3.x,不然会出错,因为他用到的一些模块在3.x版本里改名了,如果需要用2.6来运行必须将名称改回来。
参考他的脚本,我使用multiprocessing模块也写了一个,multiprocessing在2.6时被归入了标准库,这样3.x版本应该也能用(我没装,所以没试过),不同的是我这个脚本开始的输出信息可能会有点乱,而他的不会(他加了很多锁,我一个也没),其它的基本一致,我试过对比两个脚本的速度,很接近。

  1. """
  2. #####################################
  3. ## ##
  4. ## multiprocessingMesh v0.1 ##
  5. ## Author: Mack Stone ##
  6. ## Date: 2011/01/22 ##
  7. ## Email: schistone@gmail.com ##
  8. ## blog: ##
  9. ## ##
  10. #####################################
  11. """
  12. import multiprocessing
  13. import time
  14. import subprocess
  15. import sys, os

  16. # realflow install path
  17. # realflow安装路径,你可能要改它
  18. realflowRootPath = r'C:\Program Files\Next Limit\RealFlow 5'

  19. # print time info
  20. # 输出时间信息
  21. timeInfo = lambda *args: str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())))

  22. # Dump subprocess output to /dev/null to keep the terminal window output clean
  23. # 为了让命令行窗口显得干净点
  24. outPut = open('NUL')

  25. # multiprocess class
  26. # 我要输出我想要的信息,所以重写Process
  27. class MeshProcess(multiprocessing.Process):
  28.     def __init__(self, func, args, name=''):
  29.         super(MeshProcess, self).__init__()
  30.         self.name = name
  31.         self.func = func
  32.         self.args = args
  33.         
  34.     def run(self):
  35.         print '>%s -->' % timeInfo(), 'Starting', self.name
  36.         self.res = self.func(*self.args)
  37.         print '>>%s -->' % timeInfo(), self.name, 'exited'
  38.         
  39. # start realflow to process mesh
  40. # 使用realflow进行mesh
  41. def processMesh(q, scene, thread):
  42.     while not q.empty():
  43.         startFrame, endFrame = q.get()
  44.         print '>%s -->' % timeInfo(), 'Thread %d starting meshing frame %d - %d' % (thread, startFrame, endFrame)
  45.         subprocess.Popen('realflow.exe -nogui -threads 1 -mesh -range %s %s "%s"' % (startFrame, endFrame, scene),
  46.                          stdout=outPut, stderr=outPut, shell=True, cwd=realflowRootPath).wait()
  47.         print '>%s -->' % timeInfo(), 'Thread %d finished meshing frame %d - %d' % (thread, startFrame, endFrame)
  48.     
  49. def main(args):
  50.     helpText = r"""#####################################
  51. ## ##
  52. ## multiprocessingMesh v0.1 ##
  53. ## Author: Mack Stone ##
  54. ## Date: 2011/01/22 ##
  55. ## Email: schistone@gmail.com ##
  56. ## blog: ##
  57. ## ##
  58. #####################################

  59. usage: C:\Python26\python.exe multiprocessingMesh.py startFrame endFrame threadCount sceneFile
  60. Example: C:\Python26\python.exe multiprocessingMesh.py 0 100 8 C:\test\test.flw
  61. """
  62.     # if argv not right print out help
  63.     # 输出帮助信息
  64.     if len(args) < 4 or not os.path.isfile(args[3]):
  65.         print helpText
  66.         return 0
  67.     
  68.     startFrame = int(args[0])
  69.     endFrame = int(args[1])
  70.     threads = int(args[2])
  71.     sceneFile = r'%s' % args[3]
  72.         
  73.     # Populate frameList for each threads
  74.     # 计算帧列表
  75.     frameList = []
  76.     incr = (endFrame + 1) / (threads * 2) + 1
  77.     startList = [i for i in range(startFrame, endFrame+1, incr)]
  78.     endList = [i-1 for i in range(startFrame, endFrame+1, incr)]
  79.     endList.append(endFrame)
  80.     endList.pop(0)
  81.     frameList = zip(startList, endList)
  82.     
  83.     process = []
  84.     q = multiprocessing.Queue() # 创建列队
  85.     
  86.     print '>%s -->' % timeInfo(), "Begin meshing process..."
  87.     print '>>...'
  88.     # create threads
  89.     # 创建线程
  90.     for i in range(threads):
  91.         x = i + 1
  92.         p = MeshProcess(processMesh, (q, sceneFile, x),
  93.                         "Thread %d" % x)
  94.         process.append(p)
  95.         
  96.     # start threads
  97.     # 线程开始
  98.     for i in range(threads):
  99.         process[i].start()
  100.         
  101.     # Fill the queue
  102.     # 将帧列表放到列队中排队
  103.     for f in frameList:
  104.         q.put(f)
  105.         
  106.     # end threads
  107.     # 线程任务完成,结束线程
  108.     for i in range(threads):
  109.         process[i].join()
  110.         
  111.     print '>>>...'
  112.     print '>>%s -->' % timeInfo(), "End of meshing process"
  113.     
  114.     # exit
  115.     # 退出
  116.     sys.exit()
  117.     
  118. if __name__ == '__main__':
  119.     main(sys.argv[1:])
使用视频

multiprocessingMesh.mp4
使用视频

multiprocessingMesh.mp4

希望对你们有帮助
  • (1.4 KB)
  • 阅读(1206) | 评论(0) | 转发(0) |
    0

    上一篇:sorted用法再总结

    下一篇:Erlang and Python

    给主人留下些什么吧!~~