设为首页 收藏本站
查看: 784|回复: 0

[经验分享] 一个可中断的线程池python实现

[复制链接]

尚未签到

发表于 2017-5-6 10:29:12 | 显示全部楼层 |阅读模式
  我有一个需求,通过多线程测试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()
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-373693-1-1.html 上篇帖子: Learn Python The Hard Way学习(20) 下篇帖子: Python程序员的 Sublime Text 2 配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表