Home | Back
โปรแกรมเก็บ Proxy Log แบบใช้ Multiprocessing Pool
Saturday, 26 October 2013
คราวก่อนผมได้ทดลองสร้างโปรแกรมเก็บ Proxy Log ด้วย Python ซึ่งใช้เทคนิคการสร้าง Process มารับงานแล้วสร้าง Thread มารับงานต่อ (บทความคราวก่อน) ครั้งนี้ผมได้ทดลองสร้าง Proxy Log ใหม่ด้วยเทคนิคการสร้าง Process Pool เลยอยากโพสเก็บไว้ดูวันหลังอีกดังนี้ครับ
import os
import socket
import prctl
import MySQLdb as mdb
from multiprocessing import cpu_count, Pool
ip = "172.16.9.100"
port = 8899
dbHost = "172.16.9.100"
dbUser = "proxy"
dbPasswd = "proxy-secret-password"
dbName = "proxy"
def log(cur, data, addr):
dat = data.split()
query = "insert into log (`proxy`,`epoch`,`log`) values ('%s','%s','%s')" % (addr, dat[0], data,)
cur.execute(query)
def worker(data, addr):
dd = data.decode(encoding='UTF-8')
d = dd.split("\n")
con = mdb.connect(dbHost, dbUser, dbPasswd, dbName, charset='utf8', use_unicode=True)
cur = con.cursor(mdb.cursors.DictCursor)
for i in d:
if i == "":
continue
log(cur, i, addr)
con.close()
def serve():
cpu = cpu_count()*2
prctl.set_proctitle("Worker")
pool = Pool(processes=cpu)
prctl.set_proctitle("Boss")
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((ip,port))
while True:
data, addr = s.recvfrom(10000)
pool.apply_async(worker, (data, addr[0], ))
p = os.fork()
if p == 0:
serve()
print("Fork pid = %s" % p)