рдкреАрдбреАрдПрдл рдмреИрд░рд▓ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ

рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕


рдПрдХ рд╣рдм рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдгреЛрдВ рдФрд░ рд╡реЗрдм рдкреГрд╖реНрдареЛрдВ рдХреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдмрд╛рд░-рдмрд╛рд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред

рдореИрдВ рдкрд╛рдпрдерди рдФрд░ рдХреНрдпреВрдЯреА рдореЗрдВ рдкреАрдбреАрдПрдл рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЦреБрдж рдХреА "рдмрд╛рдЗрдХ" рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдХреЗрдВрджреНрд░реАрдХреГрдд рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреВрд░рдХ рдФрд░ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдкреАрдврд╝реА рдХреЛ PHP рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:

<?php //   exec('xvfb-run python2 html2pdf.py file:///tmp/in.html /tmp/out.pdf'); //  URL exec('xvfb-run python2 html2pdf.py http://habrahabr.ru /tmp/habr.pdf'); ?> 

рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рдерд╛ ...

рдпрд╣ рд╕рдм рдХреИрд╕реЗ рд╢реБрд░реВ рд╣реБрдЖ


рд╣рд╛рд▓рд╛рдБрдХрд┐, рд▓реЙрдиреНрдЪ рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП xvfb- рд░рди DISPLAY: 99 рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдХрдИ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде, рд▓рдбрд╝рдХрд┐рдпреЛрдВ рдиреЗ рд▓реЙрдЧ рдореЗрдВ рдЭрдЧрдбрд╝рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд┐рдпрд╛ред

Xpra рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж , рд╣рд░ рдмрд╛рд░ xvfb-run рдЖрд╡рд░рдг рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА , рд╡рд░реНрдЪреБрдЕрд▓ X рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛, рд▓рдбрд╝рдХрд┐рдпреЛрдВ рдиреЗ рд╢рд╛рдВрддрд┐ рдмрдирд╛ рд▓реА, рдУрд╡рд░рд╣реЗрдб рдХрдо рд╣реЛ рдЧрдпрд╛ рдерд╛:

[user@rdesk ~]$ xpra start :99

рдФрд░ рдЗрд╕ рддрд░рд╣ рдЪрд▓рд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛:
 <?php //   exec('DISPLAY=:99 python2 html2pdf.py file:///tmp/in.html /tmp/out.pdf'); //  URL exec('DISPLAY=:99 python2 html2pdf.py http://habrahabr.ru /tmp/habr.pdf'); ?> 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб html2pdf.py рд╣реИ, рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдмрдирд╛рддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ HTML рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдкреАрдбреАрдПрдл рдлрд╛рдЗрд▓ рдореЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред

рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЦреБрд▓реЗ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд▓рдЧрднрдЧ рдкреВрд░рд╛ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ
 #!/usr/bin/env python2 # -*- coding: UTF-8 -*- from PyQt4.QtCore import * from PyQt4.QtGui import * from PyQt4.QtWebKit import * import sys #     if len(sys.argv) != 3: print "USAGE app.py URL FILE" sys.exit() #   def html2pdf(f_url, f_name): #  QT  app = QApplication(sys.argv) #  "" web = QWebView() #  URL   web.load(QUrl(f_url)) #   printer = QPrinter() #   printer.setPageSize(QPrinter.A4) #   printer.setOutputFormat(QPrinter.PdfFormat) #    printer.setOutputFileName(f_name) #    ""  PDF def convertIt(): web.print_(printer) QApplication.exit() #    ,   ,   "" PDF QObject.connect(web, SIGNAL("loadFinished(bool)"), convertIt) sys.exit(app.exec_()) html2pdf(sys.argv[1], sys.argv[2]) 


рд╕рдорд╛рдзрд╛рди рдХрд╛рдлреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдерд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрдкрд╖реНрдЯ рдорд╛рдЗрдирд╕ рдХреЗ рд╕рд╛рде - рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рдПрдХ рдкреВрд░реА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреЗрд▓реЗрдмрд┐рд▓рд┐рдЯреА рдХрдо рд╣реЛ рдЧрдИред рдЗрд╕ рдмреАрдЪ, рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рд░рд╣реА рдереА, рдФрд░ рд╕рдВрд╕рд╛рдзрди рдХреА рдЦрдкрдд рдмрдврд╝ рд░рд╣реА рдереАред
рдПрдХ рдХреЗрдВрджреНрд░реАрдХреГрдд рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдорд╛рдВрд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг


рд╕рдВрдХрд▓реНрдкрдирд╛


рдбрд┐рд▓реАрд╡рд░реА рдЯреВрд▓ - рдЦрд░рдЧреЛрд╢рдмрд┐рдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреИрдирд╛рдд рдерд╛ , рдЗрд╕рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рдерд╛ред

рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╡рд┐рдирд┐рдордп - рдореВрд▓ HTML рдХреЛ рд░реЗрдВрдбрд░ рд╕рд░реНрд╡рд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдкреАрдбреАрдПрдл рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред

рдХреНрдпреЛрдВ HTML, рдФрд░ рди рдХреЗрд╡рд▓ "рд▓рд┐рдВрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ": рдореИрдВрдиреЗ рдбрд╛рдпрдирд╛рдорд┐рдХ рд╕рд╛рдордЧреНрд░реА рдЦреАрдВрдЪрдиреЗ рд╡рд╛рд▓реА рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ js рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреГрд╖реНрда рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдЦреЛрдЬрд╛ -> рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреАрдбреАрдПрдл рдкрд░ "рдШрдбрд╝реА" рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдХреБрдЫ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдореЗрдВ рдмрд╕ рдмрд╛рд╣рд░реА рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдП рдФрд░ рдмреА рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ 3 рдкреИрд░рд╛рдЧреНрд░рд╛рдл рд╣реЛрддреЗ рд╣реИрдВ, рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 2 рд▓рд┐рдВрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдкреА 1 рдФрд░ рдмреАрдкреА 2 рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ рд╡реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╢реИрд▓рд┐рдпреЛрдВ рдкрд░ рдЦрд░рд╛рдм рд╣реЛ рдЧрдП рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╕рдордп, рдордХреНрдЦреА рдкрд░ "рдкреНрд░рд┐рдВрдЯ рд╕рдВрд╕реНрдХрд░рдг" рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдПрдлрдПрд╕, рдПрдирдПрдлрдПрд╕, рдЖрджрд┐ рдордзреНрдпрд╡рд░реНрддреА рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рднрдВрдбрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ - рддреБрд░рдВрдд рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ (рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рддреИрдирд╛рддреА рдХреЗ рджреМрд░рд╛рди рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ)ред
рд╕реНрдкрд╖реНрдЯ рдкрд╕рдВрдж рдХреБрдВрдЬреА рдореВрд▓реНрдп рднрдВрдбрд╛рд░рдг рдерд╛ред рд▓рдЧрднрдЧ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдореЗрдордХрд╛рдЯреЗрдб рдЖрдпрд╛, рдЕрдЧрд░ рдПрдХ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ - рдпрд╣ рдкреБрдирд░рд╛рд░рдВрдн рд╣реЛрдиреЗ рдкрд░ рд╕рднреА рд░рд┐рдХреЙрд░реНрдб рдЦреЛ рджреЗрддрд╛ рд╣реИред
рдкрд╕рдВрдж рдмрдбрд╝реЗ рднрд╛рдИ - рд░реЗрдбрд┐рд╕ рдкрд░ рдЧрд┐рд░ рдЧрдИред
рд╕рд░рд▓, рдХреЙрдореНрдкреИрдХреНрдЯ, рддреЗрдЬ, рд╕реНрдХреЗрд▓реЗрдмрд▓, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡реАрдПрдо / рд╕реНрд╡реИрдк рдЬреИрд╕реА рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ

рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ "рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд╕реНрдкрд╖реНрдЯ рд╕реЗ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ" рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдЦрд░рдЧреЛрд╢ рдХреА рдХрддрд╛рд░ рдореЗрдВ рдкрд╛рд╕-рдереНрд░реВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЖрдИрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ:

рдХрд╛рд░реНрдп рдЖрдИрдбреА Q_app1_1314422323.65 рд╣реИ рдЬрд╣рд╛рдВ:
рдХреНрдпреВ рд╕реЗ рдХреНрдпреВ
app1 - рд╕реНрд░реЛрдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛
1314422323.65 рдпреВрдирд┐рдХреНрд╕ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк + рдПрдордПрд╕

рдкрд░рд┐рдгрд╛рдо: R_app1_1314422323.65 рдЬрд╣рд╛рдВ:
рдЖрд░ - рдкрд░рд┐рдгрд╛рдо

рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░


рд░реВрдЯ рд╡рд┐рд╡рд░рдг:
  1. рдПрдХ рдкреАрдбреАрдПрдл рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ "рдЕрдиреБрд░реЛрдз", PHP HTML рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдПрдХ рдЖрдИрдбреА рдмрдирд╛рддрд╛ рд╣реИ
  2. рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдФрд░ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдИрдбреА рдЦрд░рдЧреЛрд╢ рдХреА рдХрддрд╛рд░ рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ
  3. рд░реЗрдВрдбрд░ рдХреЛ рдПрдХ рдирдИ рдЖрдИрдбреА рдорд┐рд▓рддреА рд╣реИ
  4. рд░реЗрдВрдбрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдПрдХ HTML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЪреБрдирддрд╛ рд╣реИ
  5. рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг (рдкреНрд░рддрд┐рдкрд╛рджрди)
  6. рдПрдХ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкреАрдбреАрдПрдл рд▓рд┐рдЦрдирд╛, рд╕реНрд░реЛрдд HTML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рд╕рдлрд╛рдИ рдХрд░рдирд╛

рдлреАрдбрдмреИрдХ рдЬреЗрдирд░реЗрд╢рди рдПрдВрдб рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ
DB.EXISTS ('R_app1_1314422323.65')

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЫреЛрдЯрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
 #!/usr/bin/env python2 # -*- coding: UTF-8 -*- import pika, os, time, threading, logging, redis, Queue RBT_HOST = 'rabbit.myhost.ru' RBT_QE = 'pdf.render' RDS_HOST = 'redis.myhost.ru' LOG = 'watcher.log' MAX_THREADS = 4 #    logging.basicConfig(level=logging.DEBUG, format='%(asctime)-15s - %(threadName)-10s - %(message)s', filename=LOG ) def render(msg_id): #     output_file = '/tmp/' + msg_id + '.pdf' input_file = '/tmp/' + msg_id + '.html' #  HTML   logging.debug('[R] Loading HTML from DB...') dbcon_r = redis.Redis(RDS_HOST, port=6379, db=0) bq = dbcon_r.get(msg_id) logging.debug('[R] HTML loaded...') #  HTML    logging.debug('[R] Write tmp HTML...') fin1 = open(input_file, "wb") fin1.write(bq) fin1.close() logging.debug('[R] HTML writed...') #     command = 'DISPLAY=:99 python2 ./html2pdf.py %s %s' % ( 'file://' + input_file, output_file ) #    t_start = time.time() sys_output = int(os.system(command)) t_finish = time.time() #       i_size = str(os.path.getsize(input_file)/1024) o_size = str(os.path.getsize(output_file)/1024) #      log dbg_mesg = '[R] Render [msg.id:' + msg_id + '] ' +\ '[rend.time:' + str(t_finish-t_start) + 'sec]' + \ '[in.fle:' + input_file + '(' + i_size+ 'kb)]' +\ '[ou.fle:' + output_file + '(' + o_size + 'kb)]' #  log logging.debug(dbg_mesg) #  PDF logging.debug('[R] Loading PDF...') fin = open(output_file, "rb") binary_data = fin.read() fin.close() logging.debug('[R] PDF loaded...') #  ID   Q_  R_ msg_out = msg_id.split('_') msg = 'R_' + msg_out[1] + '_' + msg_out[2] #  PDF   logging.debug('[R] Write PDF 2 DB...') dbcon_r.set(msg, binary_data) logging.debug('[R] PDF commited...') #  ( ,   ) logging.debug('[R] DEL db record: ' + msg_id) dbcon_r.delete(msg_id) logging.debug('[R] DEL tmp: ' + output_file) os.remove(output_file) logging.debug('[R] DEL tmp: ' + input_file) os.remove(input_file) logging.debug('[R] Render done') # rets if not sys_output: return True, output_file return False, sys_output def catcher(q): '''   N     ''' while True: try: item = q.get() #     except Queue.Empty: break logging.debug('Queue send task to render: ' + item) render(item) #    q.task_done() #   #  logging.debug('Daemon START') #   TQ = Queue.Queue() logging.debug('Starting threads...') #    for i in xrange(MAX_THREADS): wrkr_T = threading.Thread(target = catcher, args=(TQ,)) wrkr_T.daemon = True wrkr_T.start() logging.debug('Thread: ' + str(i) + ' started') logging.debug('Start Consuming...') #  ,  ,    try: connection = pika.BlockingConnection(pika.ConnectionParameters(host = RBT_HOST)) channel = connection.channel() channel.queue_declare(queue = RBT_QE) def callback(ch, method, properties, body): TQ.put(body) logging.debug('Consumer got task: ' + body) channel.basic_consume(callback, queue = RBT_QE, no_ack = True) channel.start_consuming() except KeyboardInterrupt: logging.debug('Daemon END') print '\nApp terminated!' 


рдХреБрдЫ рдЖрдВрдХрдбрд╝реЗ


рдФрд╕рдд рдорд╛рдирдХреЛрдВ рдкрд░, рдЖрдзреБрдирд┐рдХ рдорд╛рдирдХреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, ProLiant DL360 G5 (8 рдХреЛрд░ E5410@2.33GHz, 16GB RAM)
рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ:
8 рдзрд╛рдЧреЗ, рдПрд▓рдП 120
рдореВрд▓ HTML 10Kb ... 5Mb
~ 5000 рдкреАрдврд╝рд┐рдпреЛрдВ рдкреНрд░рддрд┐ рдорд┐рдирдЯ
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдкреНрд░рддрд┐ рдФрд╕рдд рд╕рдордп - 5 рд╕реЗрдХрдВрдб

рдореВрд▓ HTML рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рд╕реНрдореГрддрд┐ рдХреЗ рдмреАрдЪ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдВрдмрдВрдз (рд░реИрдЦрд┐рдХ):
1MB HTML = ~ 17MB RAM

370MB рдХреЗ HTML рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде "рдзреАрд░рдЬ рдХреЗ рд▓рд┐рдП рддрдирд╛рд╡ рдкрд░реАрдХреНрд╖рдг"
рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдореБрдЭреЗ рд╡реЗрдмрдХреАрдЯ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдХреА рдЙрдореНрдореАрдж рдереА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡реНрдпрд░реНрде рд╣реЛ рдЧрдпрд╛ред
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, ~ 28,000 рдкреГрд╖реНрдареЛрдВ рдХрд╛ рдПрдХ рдкреАрдбреАрдПрдл рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рдерд╛, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЯреНрд░рд┐рдлрд╝рд▓ рдЬреЛ ~ 50 рдШрдВрдЯреЗ рдФрд░ ~ 12 рдЬреАрдмреА рд░реИрдо (: рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)

рд╕рдВрджрд░реНрдн


рд░реЗрдбрд┐рд╕ + рдкрд╛рдпрдерди
рдЦрд░рдЧреЛрд╢ + рдкрд┐рдХрд╛
xpra
рдЧрд┐рдердм рдХреЛрдб

Source: https://habr.com/ru/post/In128078/


All Articles