これを使用してプリントサーバーを実行しようと取り組んでいます: http: //new Centurycomputers.net/projects/rawprintserver.html
ファイルに書き込むように spooler.py を変更しましたが、1 つの問題を除いてすべて正常に動作しています。印刷内容を考慮すると、ジョブに時間がかかるようです...
ジョブが受信され、実際に終了する前にしっかりと 1 分間動作します。これは、「test」という単語が含まれる 1kb の txt ファイルには非常に長い時間のように思えます...
WindowsでもMacでも同じ動作をするので、OSの問題ではありません...
これは、spooler.py の変更された定義です。
class printer(base_printer):
def sendjob(self, fp, title = None):
# title is irrelevant here
print "Begin sendjob def..."
out = open('/tmp/printserv/outs/' + str(time.time()).split('.')[0]+".txt", 'w')
blk = fp.read(8192)
while blk:
out.write(blk)
print "Block written..."
blk = fp.read(8192)
print "while loop done..."
rc = out.close()
if rc is not None:
print "Error: lpr returns %02x" % rc
else:
print "OK DONE"
これは、ジョブを処理するメインの印刷ハンドラー クラス (printserver.py から) です。
class print_handler(asyncore.dispatcher):
def __init__(self, conn, addr, server, jobnumber):
asyncore.dispatcher.__init__(self, sock = conn)
self.addr = addr
self.server = server
self.jobname = JOBNAME % jobnumber
self.fp = open(self.jobname, "wb")
print "Receiving Job from %s for Printer <%s> (Spool File %s)" \
% (addr, self.server.printer.printer_name, self.jobname)
def handle_read(self):
data = self.recv(8192)
print "Starting handle_read"
if self.fp:
print "begin self.fp.write..."
self.fp.write(data)
print "end self.fp.write.."
def writable(self):
print "Writable return 0"
return 0
def handle_write(self):
print "handle_write pass"
pass
def handle_close(self):
print "Printer <%s>: Printing Job %s" \
% (self.server.printer.printer_name, self.jobname)
if self.fp:
self.fp.close()
self.fp = None
fp = open(self.jobname, "rb")
self.server.printer.sendjob(fp)
fp.close()
try:
os.remove(self.jobname)
except:
print "Can't Remove <%s>" % self.jobname
self.close()
およびメインループの定義 (printserver.py にもあります):
def mainloop(config):
if config["spooldir"]:
os.chdir(config["spooldir"])
for i in range(len(config["printer"])):
args = string.split(config["printer"][i], ",", maxsplit = 1)
prn = args[1].strip()
port = int(args[0].strip())
p = print_server('',
port, spooler.printer(prn))
servers.append(p)
try:
try:
asyncore.loop(timeout = 1.0)
except KeyboardInterrupt:
pass
finally:
print "Print Server Exit"
これらprint
は、次のようなログファイルに記録されます。
[2012/04/26 10:39:58] Raw Print Server Startup: PID = 15695 [2012/04/26 10:39:58] Starting Printer <lpr> on port 515 [2012/04/26 10:40:01] Receiving Job from ('1.2.3.4', 55070) for Printer <lpr> (Spool File RawPrintJob00001.prn) [2012/04/26 10:40:01] Writable return 0 [2012/04/26 10:40:01] Starting handle_read [2012/04/26 10:40:01] begin self.fp.write... [2012/04/26 10:40:01] end self.fp.write.. [2012/04/26 10:40:01] Writable return 0 [2012/04/26 10:40:02] Writable return 0 [2012/04/26 10:40:03] Writable return 0 [2012/04/26 10:40:04] Writable return 0 [[SNIP]] [2012/04/26 10:41:39] Writable return 0 [2012/04/26 10:41:40] Writable return 0 [2012/04/26 10:41:41] Writable return 0 [2012/04/26 10:41:42] Starting handle_read [2012/04/26 10:41:42] begin self.fp.write... [2012/04/26 10:41:42] end self.fp.write.. [2012/04/26 10:41:42] Writable return 0 [2012/04/26 10:41:42] Printer <lpr>: Printing Job RawPrintJob00001.prn [2012/04/26 10:41:42] Begin sendjob def... [2012/04/26 10:41:42] Block written... [2012/04/26 10:41:42] done writing blocks... [2012/04/26 10:41:42] OK DONE [2012/04/26 10:41:42] Starting handle_read
この時点で、ジョブは終了し、ファイルが書き込まれます。次のジョブが来るまで、他には何も記録されません。ご覧のとおり、これが完了するまでに 1.5 分以上かかりました。
私の質問は、1k ファイルを処理するのに 2 分近くかかる可能性があるということです。これはすべてギガビット LAN 上のローカルであるため、コードがジョブを処理する方法に問題があるに違いありません。EOF か何かを探していて、最終的にタイムアウトになったのではないでしょうか?
任意のポインタをいただければ幸いです