Функция отключения без ожидания ответа (Python)

У меня есть поток входящих ссылок, и я хочу время от времени проверять их на rss. Но когда я запускаю свою функцию get_rss(), она блокируется, и поток останавливается. Это не нужно, и я хотел бы просто запустить и забыть о функции get_rss() (она хранит свои результаты в другом месте).

Мой код выглядит так:

self.ff.get_rss(url)    # not async
print 'im back!'

(...)

def get_rss(url):
    page = urllib2.urlopen(url)     # not async
    soup = BeautifulSoup(page)

Я думаю, что если я могу запустить и забыть первый вызов, то я могу даже использовать urllib2, не беспокоясь о том, что он не асинхронный. Любая помощь высоко ценится!

Редактировать: пробую gevent, но ничего не происходит:

print 'go'
g = Greenlet.spawn(self.ff.do_url, url)
print g
print 'back'

# output: 
go
<Greenlet at 0x7f760c0750f0: <bound method FeedFinder.do_url of <rss.FeedFinder object at 0x2415450>>(u'http://nyti.ms/SuVBCl')>
back

Greenlet вроде бы зарегистрирован, но функция self.ff.do_url(url) вообще не запускается. Что я делаю не так?


person knutole    schedule 30.11.2012    source источник
comment
трединг твой друг   -  person zenpoy    schedule 30.11.2012
comment
но не слишком ли много начинать новый поток каждую, скажем, секунду?   -  person knutole    schedule 30.11.2012
comment
Нет, это не так, но вам это не нужно, вы можете запустить 3 потока и отправить им URL через общую очередь.   -  person e-satis    schedule 30.11.2012


Ответы (2)


Вы хотите использовать модуль threading или multiprocessing и сохраните результат либо в база данных, файл или очередь.

Вы также можете использовать gevent.

person e-satis    schedule 30.11.2012
comment
Как я мог написать это с помощью gevent? - person knutole; 30.11.2012
comment
Очень ценю ваш ответ. Но я застрял с gevent выше. Любые идеи? Спасибо. - person knutole; 30.11.2012

Запустите и забудьте об использовании многопроцессорного модуля:

def fire_and_forget(arg_one):
    # do stuff
    ...

def main_function():
    p = Process(target=fire_and_forget, args=(arg_one,))
    # you have to set daemon true to not have to wait for the process to join
    p.daemon = True
    p.start()
    return "doing stuff in the background"
person Radix    schedule 28.06.2016