Subscribe

Categories

Checkio.ORG

Subscribe to Posts

Email:

  • 26May

    obhod_vracheiпоявилась свободная минутка, решил сделать обход джанго блогов.

    И вот некоторые интересные ссылки.

    Виджет на морде. Александр Кошелев рассказывает о создании Яндекс Афиши. Как по мне, то вдохновляет.

    стать я по старее, но примерно про тоже и с той же целью.

    Куда все идут. Иван Сагалаев. Рассказывает о другом яндекс сервисе.

    К слову о предудущей моей статье.

    Global Interpreter Lock: факты и мифы

    И три небольших статьи Александра о наследовании.

    И на последок не джанго JavaScript language advanced Tips & Tricks

    Rating 3.00 out of 5
    [?]

    Tags: , , , , ,

  • 24May

    togetherЯ хотел бы кратко рассказать о некоторых базовых модулях python, предназначенных для работы с потоками, процессами, сокетами, пайпами и тому подобное.

    Потоки.

    В одно процессе может одновременно работать несколько потоков. Для организации доступа нескольких потков к одним данным python использует global interpreter lock.

    1. import threading  #higher-level interface
    2. import time, random
    3. class Counter:
    4.    def __init__(self):
    5.        self.lock = threading.Lock()
    6.  # создается объект блокировки данных
    7.        self.value = 0
    8.    def increment(self):
    9.        self.lock.acquire() # блокировка
    10.        self.value = value = self.value + 1 # изменение каких либо данных
    11.        self.lock.release()  # разблокировка
    12.        return value
    13. counter = Counter()
    14. class Worker(threading.Thread): #класс потока
    15.    def run(self): # этот метод выполняется во время работы потока
    16.        for i in range(10):
    17.          # изменение общих данных внутри потока
    18.           value = counter.increment()
    19.           time.sleep(random.randint(10, 100) / 1000.0)
    20.           print self.getName(), "– task", i, "finished", value
    21.  
    22. for i in range(10):
    23.    Worker().start() # start a worker

    Команда

    Иногда просто надо из вашей программы запустить внешнюю команду. Для этого есть модуль commands (unix only)

    1. import commands
    2. stat, output = commands.getstatusoutput("ls -lR")
    3.  # вызываем внешнюю команду. Получаем результат и статус
    4. print "status", "=>", stat
    5. print "output", "=>", len(output), "bytes"

    Pipe.

    Именованый канал. Служит для взаимодействиями между процессами. На основе этого класса можно построить конвейер взаимодействия.

    1. import pipes
    2. t = pipes.Template() # создаем объект пайпа
    3. t.append("sort", "—-")
    4. # добавляем в конец процесс sort .
    5. # "–" – означает, что используется стандартный вход или выход.
    6. t.append("uniq", "—-") # и еще один
    7. t.copy("out.txt", "")
    8. # входные данные берем из файла out.txt и отправляем в STDOUT

    STDIN и STDOUT внешних комманд

    Модуль popen2 позволяет работать с STDOUT и STDIN внешних процессов, как к обыкновенными файл хэндлами.

    1. import popen2
    2. fin, fout = popen2.popen2("sort") # запускаем внешний процесс и получаем доступы к хендлам
    3. fout.write("foo\n") # записываем в процесс
    4. fout.write("bar\n")
    5. fout.close() # закрываем
    6. print fin.readline(), # считываем строки
    7. print fin.readline(), #
    8. fin.close()

    popen3 работает также как и popen2, только возвращает еще и хэндл STDERR

    Сигналы

    Процессы могут получать внешние сигналы, и необходимо иметь возможность их обрабатывать. Ниже пример того, как приложение посылает сигнал самому себе.

    1. import signal
    2. import time
    3. def handler(signo, frame): # пишим обработчик сигнала ALRM
    4.    print "got signal", signo
    5. signal.signal(signal.SIGALRM, handler) #
    6.  
    7. signal.alarm(2) # послать самому себе сигнал ALRM через 2 сек
    8. now = time.time()
    9. time.sleep(400)
    10. print "slept for", time.time() – now, "seconds" #  узнать, сколько я спал

    Ниже пример того, как приложение посылает сигнал самому себе.

    Сокеты

    Это программный интерфейс, для обмена сообщениями между процессами. Ниже пример создания файлового сокет сервера

    1. import SocketServer
    2. import os
    3.  
    4. class MyHandler(SocketServer.StreamRequestHandler):
    5. # Класс, который будет обрабатывать запросы клиентов
    6.     def handle(self):
    7.         data = self.request.recv(1000000) # Получение данных от клиента
    8.         print 'Data:'+data
    9.         self.request.send('And you') # Отправка данных клиенту
    10.  
    11. sock_path = '/tmp/unix_socket_server'
    12. if os.path.exists(sock_path): # Если файл уже существует, то удоляем его перед стартом сервера
    13.     os.remove(sock_path)
    14. server = SocketServer.UnixStreamServer(sock_path,MyHandler) # Создаем объект сервера
    15. server.serve_forever() # запускаем его

    И клиента:

    1. import socket;
    2. sock_path = '/tmp/unix_socket_server'
    3. server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) # создание объекта клиента
    4. server.connect(sock_path) # присоединяемся к указаному сокету
    5. server.send('Hi!') # Отправляем данные
    6. print 'GET:'+server.recv(10000) # Получаем данные.

    Помимо файлового сокет сервера можно создавать TCP сервер. Где для взаимодействия используется не файловый сокет а протокол TCP/IP. Что дает возможность взаимодействовать не только локальным процессам.

    Код сервера:

    1. import SocketServer
    2.  
    3. class MyTCPHandler(SocketServer.StreamRequestHandler):
    4.     def handle(self):
    5.         data = self.request.recv(1000000)
    6.         print 'Data:'+data
    7.         self.request.send('And you')
    8.  
    9.  
    10. HOST, PORT = "localhost", 9999
    11. server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
    12. server.serve_forever()

    Проверить его работу можно просто написав в командной сроке

    1. telnet 127.0.0.1 9999

    после открытия соединение, все что вы будите писать, будет отправлятся на этот сервер по нажатию кнопки Enter.

    Но это можно делать и программно. Ниже приведен код клиента:

    1. import socket
    2. import sys
    3.  
    4. HOST, PORT = "localhost", 9999
    5.  
    6. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    7. sock.connect((HOST, PORT))
    8.  
    9. sock.send("HI")
    10. print 'GET:'+sock.recv(1024)
    11. sock.close()

    Как вы уже заметили, в коде эти два сервера отличаются сроками создания объекта сервера и клиента.

    Также для написаниея клиента можно использовать модуль telnetlib. Не думаю, что стоит тут что либо комментировать.

    1. import telnetlib
    2. tl = telnetlib.Telnet('127.0.0.1',9999)
    3. tl.write('HI')
    4. print tl.read_all()

    Для написание более сложных механизмов взаимодействия используйте Twisted. Это уже более сложная событийная модель на Python. Но перед тем как его использовать убедитесь, что это не будет стрельба из пушки по воробьям.

    Надеюсь, что эта была вам интересна и полезна. А мне интересно прочитать ваше мнение, ваши примеры и трюки. А возможно я что то забыл упомянуть по теме?

    Rating 3.00 out of 5
    [?]

    Tags: , , , , , , , ,

  • 19May

    как делать group by в моделях. В доках вещь не очевидная. Работает только с транком.

    1. def count_rubrics(post_filters):
    2.     """get dict rubric id => post count if this rubric
    3.    """
    4.     newobj = M.Post.objects.filter(**post_filters).annotate(count_rubric=Count('rubric')).\
    5.              values('rubric','count_rubric')
    6.     newobj.query.group_by = ['rubric_id']
    7.     ret = {}
    8.     for item in newobj:
    9.         ret[item['rubric']] = item['count_rubric']
    10.     return ret
    Rating 3.00 out of 5
    [?]

    Tags: , , ,

  • 14May

    CAMBODIA По версии “2008 LinuxQuestions.org Members Choice Awards” звание язык программирования года получает…….. сейчас я открою конверт…. все очень нервничают, т.к. все кандидаты одинаково заслуживают это звание…. ииии…….. Да… Python

    Rating 3.00 out of 5
    [?]

    Tags: , ,

  • 12May

    Не то, чтоб я очень глубако рыл, чтоб получить эту инфу. Но вот небольшой примерчик, как узнать все данные о файле MP3, который предусматрительно сохранен у вас на винте.

    1. #!/usr/bin/python
    2. import eyeD3
    3. mf = eyeD3.Mp3AudioFile('/home/oduvan/downloads/muzz/TQ/Gemini/02-tq-forever.mp3');
    4. print 'Size:'+str(mf.fileSize)
    5. print 'PlayTimeString:'+mf.getPlayTimeString()
    6. print 'PlayTime:'+str(mf.getPlayTime())
    7. print 'BitRate:'+str(mf.getBitRate()[1])
    8. print 'SimpleFreq:'+str(mf.getSampleFreq())
    9. tag = mf.getTag()
    10. print 'Artist:'+tag.getArtist()
    11. print 'Album:'+tag.getAlbum()
    12. print 'Title:'+tag.getTitle()
    13. print 'Year:'+tag.getYear()
    14. print 'Num:'+str(max(tag.getTrackNum()))
    15. print 'Lyrics:'+str(tag.getLyrics())
    Rating 3.00 out of 5
    [?]

    Tags: , ,

  • 11May

    goodbuy_privatbankДа. почти месяц тут ничего не писал. Ну, зато, дорогой мой читать, ты мог отдохнуть от постов с грамматическими ошибками :) Почему пауза? Нечего писать? В принципе намети есть, думаю после этого поста пойдет небольшая их серия. Основная причина — это то, что доводил один из своих проектов до ума. Очень хочу его уже вам показать, думаю на этой или следующей недели — уже будет на что смотреть. Кроме этого — я неделю назад написал заявление на увольнение из банка. Наверно это тоже довольно большой поворот в моей жизни. Я проработал тут 3 с хвостом лет. Не мало.

    ПриватБанк. Вы знаете, все мои друзья, которые уходили из банка, всегда это делали с большим негативом и даже местами пафосом. Кому то что то недодали, кого то обидели. Ну меня тоже не на руках тут носили, но тем не менее у меня есть, за что сказать ему спасибо. Я сюда пришел еще очень зеленым программером, оглянувшись назад, я бы и программером себя не стал называть. (автор намеренно опускает свою историю, она тут не особо важна, да и этот бестселлер за меня напишет кто то другой). Он дал мне шанс — показать себя. Тут я познакомился со многими своими друзьями, и больше всего не хотел бы потерять с ними связь. Тут я познакомился со своей будущей женой. Так что вспоминая это закрываеш глаза на все обиды, обманы и необъятную человеческую глупость, которую приходилось тут терпеть. И просто в определённый момент ты понимаешь, что ты просто стоишь на месте и уже никуда не движешься, не узнаешь что то новое, не получаешь новый опыт. И надо что то делать.

    Вот собственно и сделал, так что через 2 недели я снова безработный.

    А также….

    С прошедшими вас праздниками. А их тут прошло уже не мало..

    И наткнулся я на один прикольный блог startproekt.ru. Я там конечно пофекал, но в целом блог то хорош.

    Rating 3.00 out of 5
    [?]

    Tags: , , ,

   

Recent Posts

Recent Comments

  • Почему-то признаки такой "застенчивости" в рунете преобладаю...
  • >и пишеш стать>пишешОбманчивая самоуверенность...
  • Установщик макоси не видит жёсткий диск :(...
  • Когда будет 2я часть статьи? Хотелось бы почитать!...
  • Голоса пользователей. Питон красивый язык, а красоту может о...