Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 22, 2010 09:43:15

zheromo
От:
Зарегистрирован: 2010-10-02
Сообщения: 356
Репутация: +  2  -
Профиль   Отправить e-mail  

Dynamic generators

py.user.next
него в коде уже есть
Код:
while not qq.empty():

чем это отличается от предложенного
Код:
if item == ‘STOP’:
print “empty :(”
break
В первом варианте, если обработка элемента происходит быстрее, чем его добавление в очередь, цикл завершится раньше, чем будут обработаны все элементы. Во втором мы явно указываем, что элементов больше не будет и можно закончить обработку.



Офлайн

#2 Окт. 22, 2010 12:11:27

grundic
От:
Зарегистрирован: 2010-04-25
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Dynamic generators

Всем спасибо.
В итоге пришел к такому рабочему решению

import pysvn
import datetime
from time import sleep
from multiprocessing import Process, Queue, Manager
from threading import Thread


class ExportSVN(object):

def __init__(self, url):
self.client = pysvn.Client()
self.url = url
self.qq = Queue()
self.revision = None

def do_export(self):
print "Exporting {url}".format(url=self.url)
self.client.callback_notify = self.notify_export
revision = self.client.export(self.url, r'D:\tezt', force=True).number
self.revision = revision
#print "\nExported at {rev}".format(rev=revision)

def notify_export(self, event_dict):
data = "{action} -> {path}".format(action=event_dict.get('action'), path=event_dict.get('path'))
self.qq.put(data)
#print data

def infinit_gena(self):
print " *** thread gena started ***"

t = Thread(target=self.do_export,)
t.start()

while True:
sleep(0.1)
data = self.qq.get()
yield data
if not t.isAlive():
yield self.revision
break

if __name__ == '__main__':

svnex = ExportSVN("svn://vault/folder")


for line in svnex.infinit_gena():
print '{line}'.format(line=line)

raw_input("\nPress any key to continue")
multiprocessing.Process ругался на pickle.
В итоге решил использовать threads - GIL, надеюсь, не будет палкой в колесе.



Офлайн

#3 Окт. 25, 2010 03:11:33

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9851
Репутация: +  853  -
Профиль   Отправить e-mail  

Dynamic generators

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

from multiprocessing import Queue, Process
import random
from time import sleep


qq = Queue()

def fill_the_qq():
for x in xrange(10):
print "putting {x} item to queue...".format(x=x)
qq.put(x)
sleep(0.3)
qq.put('STOP')

def generator_func():
print("*** generator_func started ***")
while True:
item = qq.get()
if item == 'STOP':
print "empty :("
break
yield item

"""
def generator_func():
print("*** generator_func started ***")
while not qq.empty():
item = qq.get()
yield item
else:
print "empty :("
"""

if __name__ == '__main__':

p = Process(target=fill_the_qq)
p.start()
#p.join()

print("loop started")
for line in generator_func():
print line
print("loop ended")

raw_input("Press any key to continue\n")
терь без join'а работает

[guest@localhost tests]$ python t.py
loop started
*** generator_func started ***
putting 0 item to queue...
0
putting 1 item to queue...
1
putting 2 item to queue...
2
putting 3 item to queue...
3
putting 4 item to queue...
4
putting 5 item to queue...
5
putting 6 item to queue...
6
putting 7 item to queue...
7
putting 8 item to queue...
8
putting 9 item to queue...
9
empty :(
loop ended
Press any key to continue

[guest@localhost tests]$



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version