Форум сайта python.su
py.user.nextВ первом варианте, если обработка элемента происходит быстрее, чем его добавление в очередь, цикл завершится раньше, чем будут обработаны все элементы. Во втором мы явно указываем, что элементов больше не будет и можно закончить обработку.
него в коде уже есть
Код:
while not qq.empty():
чем это отличается от предложенного
Код:
if item == ‘STOP’:
print “empty :(”
break
Офлайн
Всем спасибо.
В итоге пришел к такому рабочему решению
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")
Офлайн
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")
[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]$
Офлайн