2013-05-20 1 views
2

Я искал примеры из других людей, но я не могу заставить его работать правильно.
Он либо использует одно ядро, либо, в основном, замораживает майю, если ему слишком много обрабатывать, но я никогда не получаю больше одного ядра, работающего одновременно.Как использовать многопоточность python (майя)

Так, например, это то, что я хотел бы сделать, на очень базовом уровне. В основном только пусть каждый цикл запуска одновременно на другом процессоре с различными значениями (в данном случае, эти два значения будут использовать два процессора)

mylist = [50, 100, 23] 

newvalue = [50,51] 

for j in range(0, len(newvalue)): 

    exists = False 
    for i in range(0, len(mylist)): 

     #search list 
     if newvalue[j] == mylist[i]: 
      exists = True 

    #add to list 
    if exists == True: 
     mylist.append(mylist) 

Можно ли осуществить это? Фактический код, который я хочу использовать, может занять от нескольких секунд до 10 минут для каждого цикла, но теоретически все они могут запускаться сразу, поэтому я думал, что многопоточность ускорит его загрузку.

Имейте в виду Я все еще относительно новый для Python, так пример будет очень ценен

Ура :)

+0

Возможно, этот ответ может помочь вам http://stackoverflow.com/questions/16470004/running-multiple-concurrent-python-programs-accessing-the-same-database-table/16470451#16470451 –

+0

Спасибо, но это в основном для баз данных, а также я посмотрел на эту страницу документа python немного раньше, но с майей это не сработало: P – Peter

+0

Куда будет идти код, который занимает больше времени? Добавьте вызов какой-либо функции 'f' где-нибудь, чтобы уточнить, какие параметры ему нужны. Вы хотите обрабатывать список «newvalue» одновременно, не так ли? –

ответ

3

Есть на самом деле два разных ответ на это.

Сценарии Maya действительно должны запускаться в основном потоке пользовательского интерфейса, и есть много способов, которыми они могут отключить вас, если вы запускаете отдельный поток. Майя включает в себя модуль maya.utils, который включает в себя методы отсроченной оценки в основном потоке. Вот простой пример:

import maya.cmds as cmds 
import maya.utils as utils 
import threading 

def do_in_main(): 
    utils.executeDeferred (cmds.sphere) 

for i in range(10): 
    t = threading.Thread(target=do_in_main, args=()) 
    t.start() 

Это позволит вам делать вещи с майа щ из отдельной нити (есть еще один метод утилитами, что позволит вызывающему потоку ждать ответа тоже). Вот link to the maya documentation on this module

Однако это не поможет вам во втором аспекте вопроса. Maya python не собирается разделять работу среди процессоров для вас: threading позволит вам создавать отдельные потоки, но все они имеют один и тот же интерпретатор python, а global interpreter lock будут означать, что они ждут его, а не бегут самостоятельно.

Вы не можете использовать модуль multiprocessing, по крайней мере, не AFAIK, так как он порождает новые майасы, а не толкает выполнение скрипта на другие процессоры майя, в котором вы работаете. В отличие от Python, Maya - старая программа, и в любом случае она не очень многоядерная. Попробуйте XSI :)

Любые мелочи в Maya сложны в любом случае - если вы касаетесь основного приложения (в основном, любой функции из API или модуля maya.whatever) без отложенного выполнения выше, вы, вероятно, будете авария майя. Используйте его только в том случае, если это необходимо.

И, BTW, вы не можете использовать executeDeferred и т. Д. В пакетном режиме, поскольку они реализованы с использованием основного цикла пользовательского интерфейса.

+0

Спасибо за ответ, просто попробовали свой код, и он кажется одним из немногих, которые работают с майей ха-ха, но в основном, вы говорите, что было бы невозможно сделать его многопоточным? Это всего лишь один плагин. У меня есть многопоточный вариант (но это решатель, поэтому он дает очень разные результаты, если это разрешено), и это эксклюзивный майя, так что наверняка эти люди должны были найти способ обойти его? – Peter

+0

майя работает многопоточно, как и для нескольких более тяжелых операций (blendshape и т. Д.) По состоянию на 2009 год, а api в основном безопасен. Однако PYTHON не может хорошо использовать многие процессоры. В любом случае все шагание должно хорошо сочетаться с минимальной нитью. Но, конечно, возможно использовать плагины, которые нитки, никаких проблем. Кроме того, архитектура mayas намного лучше подходит для therading, чем XSI. Поэтому, если вы хотите использовать многопроцессорное использование c – joojaa

+0

, Maya может запускать потоки (например, для рендеринга или моделирования), но он не разработан снизу вверх для многопроцессорности (или, если на то пошло для ускорения GPU - это было, в конце концов, в 1996 году!) – theodox