`
san_yun
  • 浏览: 2638774 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

一个可中断的线程池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()
 

 

 

分享到:
评论

相关推荐

    python实现线程池的方法

    4. **主程序**:在主程序中创建了一个线程池,并持续向任务队列中添加任务,直到收到中断信号。 #### 六、注意事项 1. **线程同步问题**:使用互斥锁和信号量来确保线程间的同步,避免数据竞争和死锁等问题。 2. **...

    Python实现线程池代码分享

    Python线程池是一种多线程处理形式,它允许程序员创建一组预先启动的线程,然后将任务添加到队列中,由这些线程去...在Python中,标准库`concurrent.futures`提供了一个更高级的线程池API,可以方便地处理这些问题。

    采用线程池机制下载文件

    在Java、C#、Python等编程语言中,都有内置或第三方库支持线程池的实现。本篇文章将深入探讨如何使用线程池机制来下载文件,以及其背后的技术原理。 首先,线程池的概念源于操作系统中的进程与线程管理。线程池是由...

    使用python实现tcp自动重连.pdf

    本篇文章将深入探讨如何使用Python实现TCP自动重连,并给出一个简单的示例代码。 首先,我们需要理解TCP连接的基本流程。TCP连接的建立通常涉及三次握手,而断开连接则需要四次挥手。在客户端,当连接因任何原因...

    Python文件多线程下载工具.zip

    然后,创建一个线程池,为每个线程分配下载任务,每个任务负责下载文件的一个部分。线程会使用`requests.get()`方法,设置适当的`Range`头,获取并保存相应部分的数据。在整个过程中,我们需要维护一个状态记录,...

    Python thread container (class)

    `Python thread container (class)` 提供了一个高效且灵活的线程管理类,它允许我们控制线程的数量并能够通过键盘中断(如按下Ctrl+C)来终止运行中的线程。在这个场景中,我们将深入探讨这个类的实现、使用方法以及...

    Python多线程下载管理

    通过以上策略,我们可以构建一个高效、可靠的Python多线程下载管理系统,充分利用系统资源,提高下载效率,为用户提供更好的体验。在实际应用中,还应考虑其他因素,如错误重试、网络连接恢复等,以增加程序的健壮性...

    Python之多线程共10页.pdf.zip

    多线程是Python中的一个重要概念,尤其在处理并发任务时显得尤为重要。在Python中,多线程允许程序同时执行多个任务,提高了程序的执行效率。下面将详细讨论Python的多线程以及相关的知识点。 1. **线程基础** - *...

    Python库 | gevent-fastcgi-1.0.2.1.zip

    gevent是一个基于greenlet的Python并发库,它使用轻量级协程(greenlet)来实现异步I/O。Greenlet类似于Python的线程,但它们的切换更为轻便,不会涉及到全局解释器锁(GIL),因此在处理I/O密集型任务时表现优秀。...

    python自学教程-12-多人版tcp服务端程序.ev4.rar

    在本Python自学教程中,我们将深入探讨如何构建一个支持多人连接的TCP服务器程序。TCP(传输控制协议)是网络通信中的一个基础协议,它确保了数据的可靠传输,通过建立面向连接的会话来保障数据的顺序和无丢失性。在...

    Python实现的Google IP 可用性检测脚本

    该Python脚本是一个用于检测Google IP可用性的工具,主要针对Google App Engine (GAE) 服务和搜索服务。脚本需要Python 3.4或更高版本,并使用了多个Python库来实现其功能。以下是该脚本涉及的关键知识点: 1. **...

    多线程Python程序示例

    - **全局解释器锁(GIL)**:Python的全局解释器锁限制了任何时刻只有一个线程执行Python字节码,这使得多线程Python程序在CPU密集型任务上表现不佳。 - **避免数据竞争**:当多个线程同时修改同一数据时可能出现...

    python 多线程操作MySQL读写脚本

    `MySQLdb`是Python的一个库,用于与MySQL数据库交互,它提供了连接、查询、事务处理等基本功能。 在描述中提到的“不停更新数据还要查询更新状态”,这可能涉及到事务的使用。在多线程环境中,为了确保数据的一致性...

    python 实现多线程下载视频的代码

    首先,代码定义了一个名为`thread`的函数,它接受一个URL作为参数。在这个函数里,首先通过`requests.get()`方法向服务器发起请求,获取视频资源。`stream=True`参数确保数据不会立即被加载到内存中,而是按需读取。...

    Python库 | oslo.service-1.14.0.tar.gz

    "Python库 | oslo.service-1.14.0.tar.gz" 是一个专注于为OpenStack项目提供服务基础架构的Python库,版本号为1.14.0。这个库是OpenStack生态系统的重要组成部分,它提供了创建服务进程和服务守护程序的基础工具,...

    基于Socket的简单聊天室

    首先,Socket是网络通信中的一个抽象概念,它代表了一个端点,用于在两个网络应用程序之间提供双向数据传输。在TCP/IP协议栈中,Socket分为两种类型:TCP Socket(面向连接)和UDP Socket(无连接)。这个聊天室项目...

    实现HTTP协议和FTP协议的多线程下载

    在实现HTTP多线程下载时,我们可以将一个大文件分成多个部分,每个部分在一个单独的线程中下载,然后将这些部分合并成原始文件。这样可以显著提高下载速度,因为多个线程可以同时从服务器获取数据。 FTP协议则是一...

    交通信号灯实现程序

    在编程领域,交通信号灯实现程序通常涉及到模拟真实世界中的交通信号灯系统,这是一个典型的并发控制问题,常常用于教学和实践多线程或异步编程。在这个程序中,我们需要关注红、黄、绿三种颜色的灯如何按照既定规则...

    SOCKET通信编程

    在本示例中,我们有一个客户端服务器端聊天程序,该程序利用了Socket通信来实现用户之间的实时对话。这个程序在工程导入后可以直接运行,并且界面设计得相当美观,为用户提供良好的交互体验。 首先,我们需要了解...

    MultiThread多线程

    一个线程中的异常可能会中断整个程序,除非有适当的处理机制,如使用`try-catch-finally`块。 **线程状态** 线程有多种状态,如新建、可运行、运行、等待、阻塞和死亡。理解这些状态有助于调试和优化多线程程序。 ...

Global site tag (gtag.js) - Google Analytics