Не удается получить argspec для вызываемых объектов Python?

Я играю с вызываемым Python. По сути, вы можете определить класс python и реализовать метод __ call __ , чтобы сделать экземпляр этого класса вызываемым. например,

class AwesomeFunction(object):
    def __call__(self, a, b):
        return a+b

Модуль inspect имеет функцию getargspec, которая дает вам спецификацию аргумента функции. Однако, похоже, я не могу использовать его для вызываемого объекта:

fn = AwesomeFunction()
import inspect
inspect.getargspec(fn)

К сожалению, у меня возникла ошибка TypeError:

Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/lib/python2.6/inspect.py", line 803, in getargspec
    raise TypeError('arg is not a Python function')
TypeError: arg is not a Python function

Я думаю, что очень жаль, что вы можете ' http://www.rdrop.com/users/paulmck/scalability/paper/whymb.2010.07.23a.pdf все объясняется очень подробно, и когда я вижу, что все ...

Я читаю «Барьеры памяти» Пола Э. МакКенни. http://www.rdrop.com/users/paulmck/scalability/paper/whymb.2010.07.23a.pdf все объясняется очень подробно, и когда я вижу, что все ясно, я сталкиваюсь с одним предложением, которое все вводит в заблуждение и заставляет меня думать, что я ничего не понял. Позвольте мне показать пример

void foo(void)
{
   a = 1; #1
   b = 1; #2
}

void bar(void)
{
   while (b == 0) continue; #3
   assert(a == 1); #4
}

, допустим, эти две функции работают на разных процессорах. Теперь, возможно, произойдет то, что сохранение в a # 1 будет видно после сохранения в b # 2 вторым процессором, потому что очереди первого процессора сохраняют в "a" и переходят к сохранению инструкции b. Хорошо, все в порядке, мы добавляем ограничение записи в строке между # 1 и # 2, но этот код все равно может дать сбой, потому что второй процессор может поставить в очередь сообщение о недействительности, поэтому мы добавляем еще одно ограничение памяти (на этот раз ограничение чтения) в линия между # 4 и # 4.

void foo(void)
{
   a = 1; #1
   write_memory_barrier();
   b = 1; #2
}

void bar(void)
{
   while (b == 0) continue; #3
   read_memory_barrier();
   assert(a == 1); #4
}

это заставляет второй процессор обрабатывать все сообщения в очереди (аннулировать a) и читать его снова, отправляя сообщение чтения MESI первому процессору на # 4. ХОРОШО. Далее в статье говорится

Многие архитектуры ЦП поэтому обеспечить более слабый барьер памяти инструкции, которые делают только один или другой из этих двух. Грубо говоря, «барьер чтения памяти» отмечает только сделать очередь недействительной и записать в память барьер »отмечает только буфер хранилища. пока полноценный барьер памяти делает и то, и другое.

Отлично, это ясно, но после этого я вижу это

Результатом этого является то, что чтение заказы на барьер памяти загружаются только на процессор, который его выполняет, так что все загрузки, предшествующие чтению памяти барьер будет казаться завершенным перед любой загрузкой после чтения барьер памяти. Точно так же запись барьер памяти заказы только магазины, снова на процессоре, который его выполняет, и снова так, чтобы все магазины, предшествующие запись барьера памяти появится завершены до любого магазина после барьера памяти для записи.

поэтому

все загрузки, предшествующие барьеру для чтения, будут кажется, что они были завершены до любой загрузки после барьер чтения памяти

, который смешивает все, что было объяснено ранее. Что это означает? Какая загрузка в функции «bar» должна завершиться перед загрузкой «a» №4? Я понимаю, что утверждение может завершиться неудачно без барьера памяти в этой функции только потому, что процессор может прочитать старое значение, потому что ему все еще не удалось аннулировать его строку кэша, где находится объект "a".

Подробное объяснение могло бы быть будьте действительно полезны, я пытаюсь понять это весь день.

Заранее большое спасибо.

11
задан confucius 22 October 2010 в 17:41
поделиться