
Народ кубиками торгует, видать отходим мы от кризиса:
Инструмент для убийства и обмана продаёт с аукциона сам себя
999 чёрных кубов пытают тайной любопытных
-
03Feb[?]
-
27Dec
Я тут немного эксперементирую с GreenSock и готовлю новые интерфейсы для GFW – вот что пока получается
Правда из библиоетчки я взял только эффекты ScrollRectPlugin и SetSizePlugin
[?] -
21Oct
-
08Oct
-
13Sep
Развел небольшой холивар на своем любимом блоге.
[?] -
26May
появилась свободная минутка, решил сделать обход джанго блогов.И вот некоторые интересные ссылки.
Виджет на морде. Александр Кошелев рассказывает о создании Яндекс Афиши. Как по мне, то вдохновляет.
стать я по старее, но примерно про тоже и с той же целью.
Куда все идут. Иван Сагалаев. Рассказывает о другом яндекс сервисе.
К слову о предудущей моей статье.
Global Interpreter Lock: факты и мифы
И три небольших статьи Александра о наследовании.
И на последок не джанго JavaScript language advanced Tips & Tricks
[?] -
24May
Я хотел бы кратко рассказать о некоторых базовых модулях python, предназначенных для работы с потоками, процессами, сокетами, пайпами и тому подобное. Потоки.
В одно процессе может одновременно работать несколько потоков. Для организации доступа нескольких потков к одним данным python использует global interpreter lock.
-
import threading #higher-level interface
-
import time, random
-
class Counter:
-
def __init__(self):
-
self.lock = threading.Lock()
-
# создается объект блокировки данных
-
self.value = 0
-
def increment(self):
-
self.lock.acquire() # блокировка
-
self.value = value = self.value + 1 # изменение каких либо данных
-
self.lock.release() # разблокировка
-
return value
-
counter = Counter()
-
class Worker(threading.Thread): #класс потока
-
def run(self): # этот метод выполняется во время работы потока
-
for i in range(10):
-
# изменение общих данных внутри потока
-
value = counter.increment()
-
time.sleep(random.randint(10, 100) / 1000.0)
-
print self.getName(), "– task", i, "finished", value
-
-
for i in range(10):
-
Worker().start() # start a worker
Команда
Иногда просто надо из вашей программы запустить внешнюю команду. Для этого есть модуль commands (unix only)
-
import commands
-
stat, output = commands.getstatusoutput("ls -lR")
-
# вызываем внешнюю команду. Получаем результат и статус
-
print "status", "=>", stat
-
print "output", "=>", len(output), "bytes"
Pipe.
Именованый канал. Служит для взаимодействиями между процессами. На основе этого класса можно построить конвейер взаимодействия.
-
import pipes
-
t = pipes.Template() # создаем объект пайпа
-
t.append("sort", "—-")
-
# добавляем в конец процесс sort .
-
# "–" – означает, что используется стандартный вход или выход.
-
t.append("uniq", "—-") # и еще один
-
t.copy("out.txt", "")
-
# входные данные берем из файла out.txt и отправляем в STDOUT
STDIN и STDOUT внешних комманд
Модуль popen2 позволяет работать с STDOUT и STDIN внешних процессов, как к обыкновенными файл хэндлами.
-
import popen2
-
fin, fout = popen2.popen2("sort") # запускаем внешний процесс и получаем доступы к хендлам
-
fout.write("foo\n") # записываем в процесс
-
fout.write("bar\n")
-
fout.close() # закрываем
-
print fin.readline(), # считываем строки
-
print fin.readline(), #
-
fin.close()
popen3 работает также как и popen2, только возвращает еще и хэндл STDERR
Сигналы
Процессы могут получать внешние сигналы, и необходимо иметь возможность их обрабатывать. Ниже пример того, как приложение посылает сигнал самому себе.
-
import signal
-
import time
-
def handler(signo, frame): # пишим обработчик сигнала ALRM
-
print "got signal", signo
-
signal.signal(signal.SIGALRM, handler) #
-
-
signal.alarm(2) # послать самому себе сигнал ALRM через 2 сек
-
now = time.time()
-
time.sleep(400)
-
print "slept for", time.time() – now, "seconds" # узнать, сколько я спал
Ниже пример того, как приложение посылает сигнал самому себе.
Сокеты
Это программный интерфейс, для обмена сообщениями между процессами. Ниже пример создания файлового сокет сервера
-
import SocketServer
-
import os
-
-
class MyHandler(SocketServer.StreamRequestHandler):
-
# Класс, который будет обрабатывать запросы клиентов
-
def handle(self):
-
data = self.request.recv(1000000) # Получение данных от клиента
-
print 'Data:'+data
-
self.request.send('And you') # Отправка данных клиенту
-
-
sock_path = '/tmp/unix_socket_server'
-
if os.path.exists(sock_path): # Если файл уже существует, то удоляем его перед стартом сервера
-
os.remove(sock_path)
-
server = SocketServer.UnixStreamServer(sock_path,MyHandler) # Создаем объект сервера
-
server.serve_forever() # запускаем его
И клиента:
-
import socket;
-
sock_path = '/tmp/unix_socket_server'
-
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) # создание объекта клиента
-
server.connect(sock_path) # присоединяемся к указаному сокету
-
server.send('Hi!') # Отправляем данные
-
print 'GET:'+server.recv(10000) # Получаем данные.
Помимо файлового сокет сервера можно создавать TCP сервер. Где для взаимодействия используется не файловый сокет а протокол TCP/IP. Что дает возможность взаимодействовать не только локальным процессам.
Код сервера:
-
import SocketServer
-
-
class MyTCPHandler(SocketServer.StreamRequestHandler):
-
def handle(self):
-
data = self.request.recv(1000000)
-
print 'Data:'+data
-
self.request.send('And you')
-
-
-
HOST, PORT = "localhost", 9999
-
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
-
server.serve_forever()
Проверить его работу можно просто написав в командной сроке
-
telnet 127.0.0.1 9999
после открытия соединение, все что вы будите писать, будет отправлятся на этот сервер по нажатию кнопки Enter.
Но это можно делать и программно. Ниже приведен код клиента:
-
import socket
-
import sys
-
-
HOST, PORT = "localhost", 9999
-
-
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-
sock.connect((HOST, PORT))
-
-
sock.send("HI")
-
print 'GET:'+sock.recv(1024)
-
sock.close()
Как вы уже заметили, в коде эти два сервера отличаются сроками создания объекта сервера и клиента.
Также для написаниея клиента можно использовать модуль telnetlib. Не думаю, что стоит тут что либо комментировать.
-
import telnetlib
-
tl = telnetlib.Telnet('127.0.0.1',9999)
-
tl.write('HI')
-
print tl.read_all()
Для написание более сложных механизмов взаимодействия используйте Twisted. Это уже более сложная событийная модель на Python. Но перед тем как его использовать убедитесь, что это не будет стрельба из пушки по воробьям.
Надеюсь, что эта была вам интересна и полезна. А мне интересно прочитать ваше мнение, ваши примеры и трюки. А возможно я что то забыл упомянуть по теме?
[?]Tags: commands, ip, pipe, popen2, python, signal, socket, tcp, thread
-
-
16Apr
Давно хотел переделать сайт своего отца, выдалась свободная минутка и… Это первый мой Django проект, увидевший мир.www.elite-board.net.ua доска объявлений. Ну и пока неделя работы, полет нормальный. Единственное, дизайн, рисовать я не умею, так что особо не стебайтесь, но критику в любом случае выслушать готов.Что внутри:
- I18N — но этим уже никого не напугаешь
- Поиск — django-sphinx.
- Вложеная навигация по тегам.
- Автодогрузка объявлений при переходе в конец страницы.
- Ну и контроль ошибок и CSV логи. Если на сайте происходит сбой, пользователю предлагают самому дополнить информацию о том, как он её получил.
openid авторизация — почти самописная. Это помимо базовой.
предпросмотр заотаченых к объявлению картинок
Хочу услышать вашу критику.
[?]Tags: django, djangosites, elite-board, My
-
10Apr
Посмотрел его доклад, впечатлился, решил вынести некоторые сноски.Сравнение большого числа баз данных
Системы мониторинга и анализа:
Contrib/pgbanch – простая программа для запуска benchmark тестов PostgreSQL
Cacti(www.cacti.net)/Nagious (www.nagios.org) – системы мониторинга различных параметров системы
Bonnie++(sourceforge.net/projects/bonnie) тестирование винта и файловой системы
pgFouine(pgfouine.projects.postgresql.org) – анализатор логов. Написан на пхпСтатьи
PostgreSQL Hardware Performance Tuning
Performance Tuning
Настройка производительности
Инструкция по оптимизации
GUCs: A Three Hour TourТакже упоминался connection pooler from Skype pgBouncer
Если у кого то есть еще интересные ссылки по теме, то кидайте, буду только рад. Спасибо.
[?]Tags: benchmark, highload, monitoring, PosgreSQL, tuning
-
30Mar
Первое, что меня смутило при работе с БД в питоне — это невозможность вернуть результаты в виде хеша, только массив строк и столбцов. И это не поддерживается в DB API принципиальноNote that the reason for not extending the DB API specification
to also support dictionary return values for the .fetch*()
methods is that this approach has several drawbacks:* Some databases don’t support case-sensitive column names or
auto-convert them to all lowercase or all uppercase
characters.* Columns in the result set which are generated by the query
(e.g. using SQL functions) don’t map to table column names
and databases usually generate names for these columns in a
very database specific way.As a result, accessing the columns through dictionary keys
varies between databases and makes writing portable code
impossible.Но есть у курсора свойство .description которое можно использовать для получения массива столбцов и преобразование результатов в хеш.
-
def fetchdictall(cursor):
-
desc = cursor.description
-
dlen = len(desc)
-
ret = []
-
for item in cursor.fetchall():
-
onerow = {}
-
for field,i in zip(desc,range(dlen)):
-
onerow[field[0]] = item[i]
-
ret.append(onerow)
-
return ret
-
def executedict(cursor,*arg):
-
cursor.execute(*arg)
-
return fetchdictall(cursor)
Но у драйвера для постгриса есть уже встроено решение:
-
#!/usr/bin/python
-
import psycopg2,psycopg2.extras
-
dbc = psycopg2.connect("user=oduvan password='gr1v1ca5a' dbname=oduvan")
-
dbc.set_isolation_level(1)
-
cursor = dbc.cursor(cursor_factory=psycopg2.extras.DictCursor)
-
dbc.set_client_encoding('UNICODE')
-
cursor.execute('select * from "t1"')
-
ret = cursor.fetchall();
-
print ret[0]['name']
Статьи по теме:
http://www.devx.com/opensource/Article/29071/0/page/1
file:///usr/share/doc/python-psycopg2/doc/extensions.rst.gz
http://www.python.org/dev/peps/pep-0249/
[?] -






Recent Comments