一个可中断的线程池python实现

我有一个需求,通过多线程测试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()
 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程池的优雅退出,需要在线程池停止接受新任务的基础上,等待所有已有任务执行完毕再停止线程池。以下是基本实现思路: 1. 设置线程池状态,用于表示线程池是否正在关闭。 2. 停止接受新任务,将线程池状态设置为 shutdown。 3. 循环遍历工作队列中的任务,将任务状态设置为取消状态,但不会中断正在执行的任务。 4. 等待一段时间,让正在执行的任务完成。 5. 不断尝试中断正在执行的任务,直到所有的任务都被中断或已经完成。 6. 关闭线程池。 代码示例: ```python import threading import queue class ThreadPool: def __init__(self, num_threads): self.tasks = queue.Queue() self.workers = [WorkerThread(self.tasks) for _ in range(num_threads)] self.shutdown = False def submit(self, func, *args, **kwargs): if not self.shutdown: self.tasks.put((func, args, kwargs)) def stop(self): self.shutdown = True # Wait for all tasks to finish while not self.tasks.empty(): task = self.tasks.get() task[2]['cancelled'] = True # Try to interrupt executing tasks for worker in self.workers: worker.interrupt() # Join threads to clean up for worker in self.workers: worker.join() class WorkerThread(threading.Thread): def __init__(self, tasks): super().__init__() self.tasks = tasks self.daemon = True self.cancelled = False def run(self): while not self.cancelled: try: task, args, kwargs = self.tasks.get(timeout=1) if not self.cancelled: task(*args, **kwargs) except queue.Empty: pass def cancel(self): self.cancelled = True def interrupt(self): self.cancel() self.join(timeout=1) ``` 在上述代码中,ThreadPool 类维护了一个工作队列和一组 WorkerThread 线程。submit 方法用于提交任务,stop 方法用于优雅关闭线程池。 WorkerThread 类继承了 threading.Thread 类,用于执行具体的任务。cancel 和 interrupt 方法用于取消线程和中断正在执行的任务。任务被取消后,需要在任务中做相应的处理,如释放资源或持久化数据等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值