NSThread или модуль потоков питонов в pyobjc? - PullRequest
4 голосов
/ 20 февраля 2009

Мне нужно выполнить некоторые сетевые вызовы (например, загрузить веб-сайт), и я не хочу, чтобы он блокировал пользовательский интерфейс. Должен ли я использовать модуль потоков NSThread или python, если я работаю в pyobjc? Я не могу найти какую-либо информацию о том, как выбрать один над другим. Обратите внимание, что меня не волнует GIL Python, поскольку мои задачи вообще не связаны с процессором.

Ответы [ 4 ]

2 голосов
/ 20 февраля 2009

Это не будет иметь значения, вы получите то же поведение с немного другими интерфейсами. Используйте то, что лучше всего подходит для вашей системы.

0 голосов
/ 05 ноября 2009

У меня есть другое предложение, в основном потому, что потоки Python просто ужасны из-за GIL (Global Interpreter Lock), особенно когда у вас более одного ядра процессора. Есть видео-презентация, которая рассказывает об этом в мучительных деталях, но я не могу найти видео прямо сейчас - это было сделано сотрудником Google.

В любом случае, вы можете подумать об использовании модуля подпроцесса вместо многопоточности (есть вспомогательная программа, которую вы можете выполнить, или используйте другой двоичный файл в системе. Или используйте NSThread, это должно дать вам большую производительность, чем вы можете получить с потоками CPython.

0 голосов
/ 26 августа 2009

Мне больше нравится нативное решение для работы с потоками Python, так как я могу присоединиться и ссылаться на потоки. AFAIK, NSThread s не поддерживает присоединение и отмену потоков, и вы могли бы сделать множество вещей с потоками Python.

Также обидно, что NSThread s не может иметь несколько аргументов, и хотя для этого есть обходные пути (например, использование NSDictionary s и NSArray s), это все же не так элегантно и так просто вызов потока с аргументами, изложенными в порядке / соответствующих параметрах.

Но да, если ситуация требует от вас использования NSThread s, не должно быть никаких проблем. В противном случае, классно придерживаться нити Python.

0 голосов
/ 20 февраля 2009

Учитесь любить цикл бега. Используйте систему загрузки URL-адресов Cocoa (или, если вам нужны простые сокеты, NSFileHandle ), и пусть она вызывает вас, когда ответ (или сбой) возвращается. Тогда вам вообще не придется иметь дело с потоками (система загрузки URL будет использовать поток для вас).

Практически единственный раз, когда вы создаете свои собственные потоки в Какао, это когда у вас есть большое задание (> 0,1 секунды), которое вы не можете разбить.

(Кто-то может сказать NSOperation, но NSOperationQueue не работает и RAOperationQueue не поддерживает параллельные операции. Хорошо, если у вас уже есть набор кода NSOperationQueue или вы действительно хотите подготовиться к работает NSOperationQueue, но если вам нужен параллелизм сейчас, запустите цикл или потоки.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...