python 线程池使用

传统多线程方案会使用“即时创建, 即时销毁”的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器将处于不停的创建线程,销毁线程的状态。

一个线程的运行时间可以分为3部分:线程的启动时间、线程体的运行时间和线程的销毁时间。在多线程处理的情景中,如果线程不能被重用,就意味着每次创建都需要经过启动、销毁和运行3个过程。这必然会增加系统相应的时间,降低了效率。

使用线程池:
由于线程预先被创建并放入线程池中,同时处理完当前任务之后并不销毁而是被安排处理下一个任务,因此能够避免多次创建线程,从而节省线程创建和销毁的开销,能带来更好的性能和系统稳定性。

体验一下使用线程池实现爬虫

在使用前需要安装线程池类库:

pip install threadpool

#!/usr/bin/env python
# coding:utf-8
# @Time : 2018/4/19 16:06
# @Author : chenjisheng
# @File : 17zwd_sample.py
# @Mail : [email protected]
from bs4 import BeautifulSoup
import threadpool
import requests
import threading
import datetime

baseurl = "http://hz.17zwd.com/sks.htm?cateid=0&page="

# 爬虫函数
def getResponse(url):
    target = baseurl + url
    content = requests.get(target).text
    soup = BeautifulSoup(content, ‘lxml‘)
    tags = soup.find_all(‘div‘, attrs={"class": "huohao-img-container"})
    for tag in tags:
        imgurl = tag.find(‘img‘).get(‘data-original‘)
        # print(imgurl)

# 定义线程为 10 个
starttime = datetime.datetime.now()
pool = threadpool.ThreadPool(10)
# 定义线程池的任务
tasks = threadpool.makeRequests(getResponse, [str(x) for x in range(1, 11)])
# 使用线程池启动任务
[pool.putRequest(task) for task in tasks]
pool.wait()
endtime = datetime.datetime.now()

alltime = (endtime - starttime).seconds
print("线程池总耗时为: {}秒".format(alltime))
# 传统线程
starttime1 = datetime.datetime.now()
tasklist = [threading.Thread(target=getResponse(str(x))) for x in range(1, 11)]

for i in tasklist:
    i.start()

for i in tasklist:
    i.join()
endtime1 = datetime.datetime.now()
alltime1 = (endtime1 - starttime1).seconds

print("传统线程总耗时为: {}秒".format(alltime1))

if __name__ == "__main__":
    pass

最后执行结果: 线程池耗时3秒,传统线程耗时9秒;

差别还是挺大的哈;

原文地址:https://www.cnblogs.com/Mail-maomao/p/8884794.html

时间: 2024-10-01 03:54:23

python 线程池使用的相关文章

我对python线程池的理解

#!/usr/bin/env pythonfrom Queue import Queuefrom threading import Threadimport randomimport time def person(i,q):    while True:  #这个人一直处与可以接活干的状态        q.get()        print "Thread",i,"do_job"        time.sleep(random.randint(1,5))#每

python线程池

线程池: 版本一: #!/usr/bin/env python # -*- coding:utf-8 -*- import Queue import threading class ThreadPool(object): def __init__(self, max_num=20): self.queue = Queue.Queue(max_num) for i in xrange(max_num): self.queue.put(threading.Thread) def get_thread

Python 线程池

python默认没有提供线程池的功能,所以要想使用线程池,就必要使用第三方的模块或者自定义线程 线程并不是越多越好,线程的上下文切换会影响到服务器的性能 线程池:一个容器,有最大数,取一个少一个,无线程时等待,线程执行完毕,交还线程 __author__ = 'alex' #coding:utf-8 import queue import threading import time class ThreadPool: def __init__(self,maxsize=5): self.maxs

一个简单的python线程池框架

初学python,实现了一个简单的线程池框架,线程池中除Wokers(工作线程)外,还单独创建了一个日志线程,用于日志的输出.线程间采用Queue方式进行通信. 代码如下: 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 __author__ = "pandaychen" 5 6 import Queue 7 import sys 8 import os 9 import threading 10 import time 11

小白成长之路:初识python(六) --python线程池

#!/usr/bin/env python# -*- coding:utf-8 -*-import threadingimport queueimport time"""对照着武老师的课程自己跟着做了一个线程池,主要的思路就是把要执行的任务放进队列中然后创建若干个线程不断地从队列中获取任务并执行相对比low B 版的线程池有很大改进,姑且叫low A版吧...""" Stop_Flag = object() class ThreadPool(ob

Python线程池任务

#!/usr/bin/env python # -*- coding:utf-8 -*- from concurrent.futures import ThreadPoolExecutor #线程池,导入模块 import time def task(hostname): ''' 假设这里是要提交的任务 :param hostname: :return: ''' time.sleep(2) print(hostname) #创建线程池线程数自定义,要看主机性能,例如创建20个线程 pool =

[python] ThreadPoolExecutor线程池 python 线程池

初识 Python中已经有了threading模块,为什么还需要线程池呢,线程池又是什么东西呢?在介绍线程同步的信号量机制的时候,举得例子是爬虫的例子,需要控制同时爬取的线程数,例子中创建了20个线程,而同时只允许3个线程在运行,但是20个线程都需要创建和销毁,线程的创建是需要消耗系统资源的,有没有更好的方案呢?其实只需要三个线程就行了,每个线程各分配一个任务,剩下的任务排队等待,当某个线程完成了任务的时候,排队任务就可以安排给这个线程继续执行. 这就是线程池的思想(当然没这么简单),但是自己编

python线程池(转)

ThreadPool: #! /usr/bin/env python # -*- coding: utf-8 -*- import threadpool import time def sayhello (a): print("hello: "+a) time.sleep(2) def main(): global result seed=["a","b","c"] start=time.time() task_pool=th

一个简单缩略版的python 线程池实现

1 #-*-coding:utf-8-*-2 2 3 import threading 4 import queue 5 import itertools 6 import os 7 import time 8 9 10 RUN = 0 11 CLOSE = 1 12 TERMINATE = 2 13 job_counter = itertools.count() 14 15 16 class Pool(object): 17 18 def __init__(self, max_thread_n