Являются ли функции Python безопасными для потоков? (Особенно этот?) - PullRequest
2 голосов
/ 01 марта 2010

Прежде чем ответить, пожалуйста, поймите, я НЕ хочу, чтобы вы делали работу за меня. Я бы предпочел сформулировать ответ на вопрос о том, почему существует моя (возможно, теоретическая) проблема, и объяснение процесса ее устранения. Мне труднее учиться правильно, когда кто-то просто делает за меня работу. Заранее спасибо.

У меня есть эта функция: она делает именно то, что выглядит, как она делает. Он использует HTML-код со страницы, содержащей идентификатор Facebook, и возвращает идентификатор после его обнаружения.

def getID(data): #Find an ID from HTML input.
    data = str(data)
    appstring = 'http://apps.facebook.com/castle_age/keep.php?user=' #We're gonna find this in the html.
    appstr_start_pos = data.find(appstring) #Tell us where we found it oh mighty one!
    if appstr_start_pos != -1: #If we find it.
        begin_ID_pos = appstr_start_pos + len(appstring)
        end_ID_pos = data.find('"', begin_ID_pos) #Find the end quote, that'll be the end of our ID string.

        our_ID = data[begin_ID_pos:end_ID_pos]
        return our_ID

В данный момент у меня нет упаковки в одном из моих классов, который использует метод thread.Threading, но я все еще регулярно его вызываю. Мой код сейчас выполняет только один поток, и, возможно, мне понадобится вызвать эту функцию из другого многопоточного класса; Это возможно? Если нет, как я могу использовать эту функцию между многопоточными классами?

Более простая форма вопроса: если я вызову эту функцию из многопоточной среды, возникнут ли у меня проблемы или мне нужно переместить ее в свой собственный класс? Есть ли способ сохранить функцию доступной между двумя различными объектами с резьбой (если так, какой самый простой способ)?

Вот полный код: http://pastebin.com/txH8PvL3 - Имейте в виду, что это WIP, как практика для изучения потоков ...

Ответы [ 3 ]

7 голосов
/ 01 марта 2010

Более простая форма вопроса: если я вызову эту функцию из многопоточной среды, возникнут ли у меня проблемы,

Да, это потокобезопасность из того, что я могу сказать

или мне нужно перевести его в свой класс?

Безопасность потоков не имеет ничего общего с классами: она имеет отношение к общему состоянию. Если потоки разделяют состояние, должны быть предусмотрены условия для доступа / изменения этого состояния в поточно-безопасном режиме, то есть с использованием блокировок.

0 голосов
/ 01 марта 2012

Это не так просто, потому что каждая функция get*() может использовать кэши.Таким образом, каждый вызов может привести к изменениям данных.-> проблема

0 голосов
/ 01 марта 2010

Встроенные функции len(), str(), используемые в вашей функции, могут быть исправлены в других потоках.

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