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)


Home | Back