python3中线程池

1.在使用多线程处理任务时也不是线程越多越好,由于在切换线程的时候,需要切换上下文环境,依然会造成cpu的大量开销。为解决这个问题,线程池的概念被提出来了。预先创建好一个较为优化的数量的线程,让过来的任务立刻能够使用,就形成了线程池。在python中,没有内置的较好的线程池模块,需要自己实现或使用第三方模块。下面是一个简单的线程池:

import threading,time,os,queue

class ThreadPool(object):
    def __init__(self,maxsize):
        self.maxsize = maxsize
        self._q = queue.Queue(self.maxsize)
        for i in range(self.maxsize):
            self._q.put(threading.Thread)

    def getThread(self):
        return self._q.get()

    def addThread(self):
        self._q.put(threading.Thread)

def fun(num,p):
    print(‘this is thread [%s]‘%num)
    time.sleep(1)
    p.addThread()

if __name__ == ‘__main__‘:
    pool = ThreadPool(2)
    for i in range(103):
        t = pool.getThread()
        a = t(target = fun,args = (i,pool))
        a.start()

2.利用线程池和paramiko实现对远程服务器的访问获取到相关信息:(自己写的例子,比较low)

import paramiko,threading
import queue

class ThreadPool(object):
    def __init__(self,maxsize):
        self.maxsize = maxsize
        self._q = queue.Queue(self.maxsize)
        for i in range(self.maxsize):
            self._q.put(threading.Thread)

    def getThread(self):
        return self._q.get()

    def addThread(self):
        self._q.put(threading.Thread)

def ssh_fun(ip,user,password,pool):
    try:
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(ip, 22, user, password)
        stdin, stdout, stderr = ssh.exec_command(‘hostname‘)
        info = stdout.read().decode().strip()
        print(‘IP:%s  hostname:%s‘%(ip,info))
        ssh.close()
    except Exception:
        print(‘sorry I can`t connect this server [%s]‘%ip)
    pool.addThread()

if __name__ == ‘__main__‘:
    t_list = []
    pool = ThreadPool(2)
    with open(‘aaa‘,‘r+‘,encoding=‘utf-8‘) as f:
        for line in f:
            split = line.split()
            ip,user,password = split[0],split[1],split[2]
            th = pool.getThread()
            t = th(target=ssh_fun,args=(ip,user,password,pool))
            t.start()
            t_list.append(t)
    for i in t_list:
        i.join()

在这里我为了测试线程池中只有两个线程,并且我这个是读取aaa文件的,这个文件中包含用户名和密码等相关信息,样子如下(其实可以把这些放进数据库中,使用python从数据库中进行读取):

192.168.32.167  root    111111
192.168.32.110  root    111111
192.168.32.120  root    111111
192.168.32.150  root    111111

而最后执行的效果如下:

IP:192.168.32.167  hostname:ns.root
sorry I can`t connect this server [192.168.32.110]
IP:192.168.32.150  hostname:localhost.localdomain
sorry I can`t connect this server [192.168.32.120]

时间: 2024-08-27 07:21:31

python3中线程池的相关文章

关于Java中线程池的解读

之前的面试中多次被问到线程池的相关内容,所以在之后的时间内我仔细的学习了一下线程池的相关内容. 1.使用线程池的意义 复用:类似WEB服务器等系统,长期来看内部需要使用大量的线程处理请求,而单次请求响应时间通常比较短,此时Java基于操作系统的本地调用方式大量的创建和销毁线程本身会成为系统的一个性能瓶颈和资源浪费.若使用线程池技术可以实现工作线程的复用,即一个工作线程创建和销毁的生命周期期间内可以执行处理多个任务,从而总体上降低线程创建和销毁的频率和时间,提升了系统性能. 流控:服务器资源有限,

AsyncTask中线程池调度分析

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/42583215 在Android中,和异步执行相关的两个类就是Handler和AsyncTask,所以Android开发人员对于这两个类是再熟悉不过了,所以这里我不是讲解AsyncTask怎么使用,而是想分析一下AsyncTask中线程池的调度过程,然后简单的介绍一下AsyncTask的源码以及Android3.0前后,AsyncTask中线程池的区别. 在正式学习AsyncTask中的线程

java中线程池

在jdk1.5中加入了java.util.concurrent,这个包中主要介绍java中线程以及线程池的使用 现在看怎么创建一个线程池,在java中Executors类创建线程池的,而线程池分为三类, 1:Executors.newFixedThreadPool(3);//这是固定的线程池 2: Executors.newCachedThreadPool();创建一个带缓存的线程池,比如创建了3个线程在线程池中,但是现在有10个线程在执行任务,因此它还会创建7个线程 3:Executors.n

Java并发编程中线程池源码分析及使用

当Java处理高并发的时候,线程数量特别的多的时候,而且每个线程都是执行很短的时间就结束了,频繁创建线程和销毁线程需要占用很多系统的资源和时间,会降低系统的工作效率. 参考http://www.cnblogs.com/dolphin0520/p/3932921.html 由于原文作者使用的API 是1.6 版本的,参考他的文章,做了一些修改成 jdk 1.8版本的方法,涉及到的内容比较多,可能有少许错误. API : jdk1.8.0_144 ThreadPoolExecutor类 Java中线

JAVA中线程池的简单使用

比如现在有10个线程,但每次只想运行3个线程,当这3个线程中的任何一个运行完后,第4个线程接着补上.这种情况可以使用线程池来解决,线程池用起来也相当的简单,不信,你看: package com.demo; import java.util.ArrayList; import java.util.Collection; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public

第九章 Java中线程池

Java中的线程池是运用场景最多的并发框架,几乎所有需求异步或并发执行任务的程序都可以使用线程池.在开发过程中,合理地使用线程池能够带来3个好处. 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行 提高线程的可管理性:线程是稀缺资源,如果无限制地创建,不仅消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配.调优和监控 线程池的实现原理 当向线程池提交一个任务之后,线程池是如何处理这个任务呢?如图 从

java中线程池创建的几种方式

java中创建线程池的方式一般有两种: 通过Executors工厂方法创建 通过new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)自定义创建 Executors工厂方法创建 package com.javaBase.LineDistancePond; import java.util.

java中线程池的理解和使用

看过很多关于线程的文章,但还是觉得需要说些什么. 我只想说使用线程池的时候,就不要自己写队列和循环等东西了. 代码如下: 1 public class SqlLogRecorder { 2 private static Logger logger = LoggerFactory.getLogger(SqlLogRecorder.class); 3 4 public SqlLogRecorder(MSConfigManager configManager){ 5 // 可以根据需要创建不同类型的连

python3中线程中event的小栗子

import threading, time class Boss(threading.Thread): def run(self): print("boss:今晚大家都要加班到22:00") print(event.isSet()) event.set() time.sleep(5) print("BOSS:<22:00>可以下班了") print(event.isSet()) event.set() class Worker(threading.Th