Ответы пользователя по тегу Python
  • Как правильно реализовать мультипоточность?

    Bahusss
    @Bahusss
    Python Master
    Предлагаю вам свой вариант, через очередь задач:

    from Queue import Queue
    from threading import Thread
    
    def scrape(link):
        conn = sqlite3.connect('db.sqlite3')
        curs = conn.cursor()
        # insert link, close connection
    
    class Worker(Thread):
    
        def __init__(self, tasks):
            super(Worker, self).__init__()
            self.tasks = tasks
            self.daemon = True
    
        def run(self):
            while True:
                link = self.tasks.get()
                try:
                    scrape(link)
                finally:
                    self.tasks.task_done()
    
    
    if __name__ == '__main__':
        # максимальное количество одновременных потоков
        capacity = 0  # infinite
        queue = Queue(capacity)
    
        workers = 3
        for _ in range(workers):
            Worker(queue).start()
    
        for link in select.fetchall():
            queue.put(link)
    
        queue.join()
        print 'Done'
    Ответ написан
    4 комментария
  • Есть ли в Python и Go делегаты?

    Bahusss
    @Bahusss
    Python Master
    Делегирование - это шаблон проектирования, и реализовать его можно на большинстве современных языков программирования. Пример для Python есть в вики, никаких дополнительных ключевых слов для реализации делегатов в питоне не требуется, т.к. любой метод можно передать в качестве параметра куда угодно. Так же можно помещать методы в структуры данных, вот пример:

    def say_hello(name):
        print 'Hello,', name
    
    def say_goodbye(name):
        print 'Bye,', name
    
    phrases = {
        'hello': say_hello,
        'bye': say_goodbye,
    }
    
    def say(what, name):
        phrases[what](name)
    
    say('hello', 'Ivan')
    say('bye', 'Oleg')


    В Go этот паттерн реализуется тоже очень лаконично.
    Ответ написан
    Комментировать
  • Как правильно создать *.exe при помощи pyinstaller на CentOS?

    Bahusss
    @Bahusss
    Python Master
    Все достаточно внятно написано в FAQ pyinstaller'a - он не работает как кросс-компайлер, поэтому собрать виндовый .exe из под CentOs можно только в wine: https://github.com/pyinstaller/pyinstaller/wiki/FA...
    Ответ написан
    Комментировать
  • Как экспортировать результат выполнения из другого модуля в python?

    Bahusss
    @Bahusss
    Python Master
    Если я правильно понял вопрос, вам необходимо добавить некое глобальное хранилище, где вы сможете сохранять результаты выполнения декоратора register. В простом случае выглядеть это может так:

    создаете рядом с main.py новый файл, допустим api_routing.py со следующим содержимым:
    # здесь может быть структура и посложнее, все зависит от потребностей
    # если планируется использование тредов, то возможно лучшим вариантом будет threading.local
    # или это может быть объект с методом add например
    API_ROUTING_TABLE = {}

    Далее в файле \api\module1\function1.py:
    # в PYTHONPATH должна быть добавлена директория где лежит api_routing.py 
    # это можно сделать разными способами, 
    # подробнее здесь https://docs.python.org/2/tutorial/modules.html#the-module-search-path
    from api_routing import API_ROUTING_TABLE
    
    # использовать изменяемые структуры данных в параметрах по умолчанию - плохой тон и поле для ошибок
    def register(path,
                 method="GET",
                 content_type="application/json",
                 parameters=(),
                 responseMessages=(),
                 nickname=None,
                 notes=None,
                 bp=None):
        def inner_func(f):
            # сохраняем информацию об API-вызове в глобальную переменную
            API_ROUTING_TABLE[path] = {'method': method, 'content_type': content_type, ...}
    
            print (path, f, method, content_type, parameters,
                           responseMessages, nickname, notes, bp)
        return inner_func

    теперь в main.py вы можете написать:
    # эти импорты обязательны в начале, если их не будет то API_ROUTING_TABLE не заполнится
    from api.module.function1 import Class1
    
    from api_routing import API_ROUTING_TABLE
    print API_ROUTING_TABLE


    Таким образом переменную API_ROUTING_TABLE можно импортировать в любом месте вашего кода, главное чтобы до этого импорта где-нибудь раньше обязательно были заимпорчены модули, в которых применяется декоратор register.
    Ответ написан
    Комментировать
  • Неблокирующее чтение (на уровне ос) файла в питоне?

    Bahusss
    @Bahusss
    Python Master
    Если речь идет про *nix, то посмотрите в сторону функции os.open: https://docs.python.org/2/library/os.html#os.open, скорее всего вам необходимо открывать файл с флагом O_NONBLOCK, больше информации здесь.

    C Windows все сложнее: stackoverflow.com/a/18262401/385884
    Ответ написан
    Комментировать
  • Python Remote Objects - написанный код?

    Bahusss
    @Bahusss
    Python Master
    Где-то год назад, когда нужно было организовать удаленное исполнение питоновского кода на нескольких машинах, я выбирал между двух проектов: Pyro (вы его указали) и RPyc (http://rpyc.wikidot.com/). После недолгого анализа выяснилось, что RPyc использовать намного проще и он прекрасно подходил для моих задач. К сожалению сейчас проект не развивается (не обновлялся уже год), но я всё-таки рекомендую посмотреть документацию и скринкаст по ссылке.
    Ответ написан
    Комментировать
  • Python: посоветуйте форум, конференцию или похожее

    Bahusss
    @Bahusss
    Python Master
    Более менее активный форум python.su/forum/, соответствующая конференция — pythonua@conference.jabber.ru
    Ответ написан
    Комментировать