Только цифры из головы (ну или с теми которые знаю я сильно не совпадают), соответственно график едет.
Своими глазами наблюдал разницу типа 50 легальных копий vs 50к нелегальных из китая
ну твистед позволит наиболее полно загрузить одно ядро, так что если нету реально необходимости параллелить (например когда большую часть времени мы ждем ответы), то лучше не параллелить.
ну а если надо — делается аналогичная реализация на базе хотя бы memcached или flock. даже сам класс придется не сильно много переписывать
ну и d = some_service.do_long_boring_call(a) — этот вызов же скорее всего должен вернуть Deferred, иначе смысл использовать лок? в таком случае в multiply попадет не результат, а всего лишь Deferred.
п.с. ничего личного, но с твистедом и так местами непонятно, что произошло, так что примеры без адекватной обработки ошибок и содержащие ошибки могут еще больше запутать понимание
d.addCallback(power,a) читать как d.addCallback(multiply, a)?
ну и еще бы хорошо добавить d.addCallbacks(release_pool, release_pool), а то релиз походу не вызывается во втором примере
я так понимаю это коммент мне =)
асинхронное программирование, лично для меня, дает некоторые плюсы — отсутствие синхронизации. это очень здорово упрощает программирование, т.к. я здорово гробил силы на многопоточно-специфические вещи.
для чего стоит делать много потоков — именно загрузить много ядер, ведь если одно ядро справляется, а все остальное ввод-вывод, то смысл блокироваться на этих событиях? я понимаю, что проще использовать много потоков, что бы сделать то, что можно сделать асинхронно, но это только если ты привык писать многопоточные вещи.
стандартные операции с питоновскими сокетами — станут асинхронными, написаные без их участия — нет.
я думаю вам стоит посмотреть на twisted. это, наверное, одна из лучших вещей, которую я видел в питоне. во-первых — это стандартный cpython, т.е. можно быть уверенным в том, что не придется пилить чужие исходники. во-вторых — там есть фактически все тоже самое, заменяем каналы на DeferredQueue и получаем сходный эффект. Надо, конечно stateless функции писать, но это как и везде.
ну и обычные методы для IPC — amqp. или можно глянуть zeromq, если хочется совсем скорости
там urlopen заменен на асинхронную версию, т.е. когда вы делаете urlopen — управление передается интерпретатору.
в stackless для этого все написано несколько версий socket библиотек (e.g. stacklesssocket)
Своими глазами наблюдал разницу типа 50 легальных копий vs 50к нелегальных из китая
Но в целом идея верная =)
ну а если надо — делается аналогичная реализация на базе хотя бы memcached или flock. даже сам класс придется не сильно много переписывать
п.с. ничего личного, но с твистедом и так местами непонятно, что произошло, так что примеры без адекватной обработки ошибок и содержащие ошибки могут еще больше запутать понимание
ну и еще бы хорошо добавить d.addCallbacks(release_pool, release_pool), а то релиз походу не вызывается во втором примере
def f(n):
print '-'.join(map(str, xrange(1, n+1))[::-1 if (n+1)%2 else 1])
2pay: docs.google.com/leaf?id=0B1aNT1vf2GTEOTNjMTA1ZWYtZTA2Zi00NjY4LTljZGYtMmY3ZjEwYjZmYTQ5&hl=en
асинхронное программирование, лично для меня, дает некоторые плюсы — отсутствие синхронизации. это очень здорово упрощает программирование, т.к. я здорово гробил силы на многопоточно-специфические вещи.
для чего стоит делать много потоков — именно загрузить много ядер, ведь если одно ядро справляется, а все остальное ввод-вывод, то смысл блокироваться на этих событиях? я понимаю, что проще использовать много потоков, что бы сделать то, что можно сделать асинхронно, но это только если ты привык писать многопоточные вещи.
я думаю вам стоит посмотреть на twisted. это, наверное, одна из лучших вещей, которую я видел в питоне. во-первых — это стандартный cpython, т.е. можно быть уверенным в том, что не придется пилить чужие исходники. во-вторых — там есть фактически все тоже самое, заменяем каналы на DeferredQueue и получаем сходный эффект. Надо, конечно stateless функции писать, но это как и везде.
ну и обычные методы для IPC — amqp. или можно глянуть zeromq, если хочется совсем скорости
в stackless для этого все написано несколько версий socket библиотек (e.g. stacklesssocket)
например что-то вроде:
import stacklesssocket
stacklesssocket.install()
будет манкипатчить стандартный сокет.
www.youtube.com/watch?v=CYY-g6ionzM