我有一个需求,通过多线程测试python memcached的性能:
class TestThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
while True:
print mc.get('test')
for i in xrange(8):
t = TestThread()
t.start()
但是坑爹的是,怎么优雅的让他停止呢?我实现了一个Executor
# -*- coding: utf-8 -*-
import re
import urllib2
import json
import threading
import Queue
import os
import time
from time import sleep
from threading import Lock
from signal import signal,SIGTERM,SIGINT,SIGQUIT
class Executor:
def __init__(self,size):
self.queue = Queue.Queue()
self.tasks = []
self.running = True
for i in range(size):
t = Task(self.queue)
t.setDaemon(True)
t.start()
self.tasks.append(t)
self._signal()
def _signal(self):
signal(SIGTERM,self._exit)
signal(SIGINT,self._exit)
signal(SIGQUIT,self._exit)
def _exit(self,a=None,b=None):
print '_exit'
self.cancel()
def cancel(self):
for task in self.tasks:
while not task.cancel():
#print 'try again %s' %task.getName()
#sleep(0.1)
pass
self.running = False
self.onCancel()
def submit(self,call):
self.queue.put(call)
def join(self):
#self.queue.join() queue.join()会阻塞,所以不用
while self.running and not self.queue.empty():
sleep(0.1)
if self.hasattr('cancelTrigger') and self.cancelTrigger():
self.cancel()
def setCancelTrigger(self,cancelTrigger):
self.cancelTrigger = cancelTrigger
def setOnCancel(self,onCancel):
self.onCancel = onCancel
#print self.onCancel
class Task(threading.Thread):
def __init__(self,queue):
threading.Thread.__init__(self)
self.queue = queue
self.running = True
self.canceled = False
def cancel(self):
#self.canceled=True
self.running=False
return self.isCanceled()
def isCanceled(self):
return self.running==False
def run(self):
while self.running:
call = self.queue.get()
call.run()
self.queue.task_done()
if self.canceled:
self.running = False
如何使用:
class Checker():
def run(self):
print mc.get('test')
executor = Executor(10)
for x in xrange(100):
executor.submit(Checker())
executor.join()
分享到:
2012-11-12 16:55
浏览 1573
分类:非技术
评论