# Author: yeshengbao
# -- coding: utf-8 --
# @Time : 2018/5/24 21:38
# 进程:如一个人拥有分身(分数数最好为cpu核心数)几乎同时进行做工
# 线程:如这个人正在烧开水,但同时又可以在烧水时间内去吃饭,和扫地,这时线程就会对其随机选择,可能还会出现地还没扫完,水就开了,但他还会扫地{这就可能出现数据丢失}。。
# 协程:这个一个比线程更小的线程非常相似,但他在执行任务时,已经被规划好了,不会就行额外的时间浪费,创建时更省资源 import datetime
import requests
import os
import hashlib
from multiprocessing import Process
from lxml import etree
from threading import Thread
from gevent import monkey
import gevent monkey.patch_socket() # 开启猴子方法, 必须加
bag = '書'
if not os.path.exists(bag):
os.mkdir(bag) class DouTu(object):
def __init__(self):
self.url = 'http://www.23us.so/files/article/html/6/6926/index.html'
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"
" Chrome/64.0.3282.186 Safari/537.36",
} def md5(self, strs):
stri = hashlib.md5(strs.encode('utf-8'))
key = stri.hexdigest()
return key def get_source(self, url, headers):
try:
response = requests.get(url, headers=headers, timeout=10).content
return response
except Exception:
return self.get_source(url, headers) def get_detail_content(self, frction_detail_url):
if frction_detail_url:
html = self.get_source(frction_detail_url, self.headers).decode('utf-8')
doc = etree.HTML(html)
title = doc.xpath('.//div[@class="bdsub"]/dl/dd[1]/h1/text()')[0]
content = ''.join(doc.xpath('.//div[@class="bdsub"]/dl/dd[@id="contents"]/text()')).strip().replace('\n', '').replace('\t', '')
if content:
with open(bag + '\\' + 'text.txt', 'a+' , encoding='utf-8')as fp:
fp.write(title + ' :' + content + '\n')
print('正在写入{}_{}'.format(title, content)) def analysis_index(self, html):
doc = etree.HTML(html)
td_list = doc.xpath('.//table[@id="at"]//td[@class="L"]')
thread_list = []
for td in td_list:
xie = gevent.spawn(self.get_detail_content, td.xpath('./a/@href')[0])
xie.start()
thread_list.append(xie)
print(xie) # while True:
# if len(thread_list) < 100: # 可选择开启多少线程
# th = Thread(target=self.get_detail_content, args=(td.xpath('./a/@href')[0], ))
# th.start()
# thread_list.append(th)
# break
#
# else:
# print(thread_list)
# #time.sleep(3)
# for ths in thread_list:
# if not ths.is_alive():
# thread_list.remove(ths) for th in thread_list: # 为保证线程或协程的运行结束
th.join() def begin_spider(self):
html = self.get_source(self.url, self.headers).decode('utf-8')
self.analysis_index(html) start_time = datetime.datetime.now() # 程序开始时间
doutu = DouTu()
doutu.begin_spider()
over_time = datetime.datetime.now() # 程序结束时间
total_time = (over_time-start_time).total_seconds()
print('程序共计%s秒' % total_time) # 线程 620页 约40s
# 协程 18s # thread_lists = []
# for page in range(50, 81):
# while True:
# if len(thread_lists) < 8:
# # th = threading.Thread(target=dou.begin_by_page,args=(page,))
# th = multiprocessing.Process(target=dou.begin_by_page, args=(page,))
# th.start()
# thread_lists.append(th)
# break
# else:
# time.sleep(3)
# print(thread_lists)
# print('进程池已经满了')
# for ths in thread_lists:
# if not ths.is_alive():
# thread_lists.remove(ths)
# for ths in thread_lists:
# ths.join()

python 进程/线程/协程 测试的更多相关文章

  1. Python 进程线程协程 GIL 闭包 与高阶函数(五)

    Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 ​ 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...

  2. python -- 进程线程协程专题

    进程专栏 multiprocessing 高级模块 要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fork() ...

  3. python 进程 线程 协程

    并发与并行:并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔内发生.在单核CPU下的多线程其实都只是并发,不是并行. 进程是系统资源分配的最小单位,进程的出现是为了更好的 ...

  4. python进程/线程/协程

    一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...

  5. Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程

    1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...

  6. python自动化开发学习 进程, 线程, 协程

    python自动化开发学习 进程, 线程, 协程   前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...

  7. 进程&线程&协程

    进程  一.基本概念 进程是系统资源分配的最小单位, 程序隔离的边界系统由一个个进程(程序)组成.一般情况下,包括文本区域(text region).数据区域(data region)和堆栈(stac ...

  8. 多道技术 进程 线程 协程 GIL锁 同步异步 高并发的解决方案 生产者消费者模型

    本文基本内容 多道技术 进程 线程 协程 并发 多线程 多进程 线程池 进程池 GIL锁 互斥锁 网络IO 同步 异步等 实现高并发的几种方式 协程:单线程实现并发 一 多道技术 产生背景 所有程序串 ...

  9. python的进程/线程/协程

    1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...

随机推荐

  1. python基础—sys与os库

    python可以用sys库打印环境变量或者查看当前文件的脚本路径,具体代码: import sysprint(sys.path[2])#打印环境变量print(sys.argv)#当前脚本路径 os库 ...

  2. 字符串与NUll的拼接问题

    今天做项目,浏览器向后台传值的时候,碰到一个问题,声明变量的时候为null时,首次加载会报错.但是初始化一次后,就正常传值了,摸索了半天,终于找到问题所在.在此记录一下,谨记. 现在说说情况,我在JS ...

  3. shell 删除颜色代码

    sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"

  4. Beta冲刺第二周王者荣耀交流协会第六次会议

    1.立会照片 成员:王超,高远博,冉华,王磊,王玉玲,任思佳,袁玥全部到齐. master:任思佳 2.时间跨度: 2017年11月22日 12:00 — 12:20,总计20分钟. 3.地点: 一食 ...

  5. java数字转IP 一行

    System.out.println(InetAddress.getByName(String.valueOf(12345)).getHostAddress());

  6. Golang的流程控制

    流程控制 条件语句 例: var b bool = true if b{ fmt.Print("b是True") }else{ fmt.Print("b是false&qu ...

  7. skynet的火焰图

    之前搞过一下systemtap(systemtap折腾笔记),可惜很快琐事缠身,没有继续搞下去.最近偷空搞了一下,有点意思. 章大大的思路,是用perl生成systemtap脚本,从/proc/$pi ...

  8. 关于grub修复引导系统

    这周末遇到停电,机房的一台数据服务器启动不了,开机硬件自检以后,就停留在一个黑屏状态左上角有光标闪烁,却一直进入不了系统. 还好手里有centos6.5的系统盘,进入修复选项,具体进入修复请参照这里 ...

  9. css flex方法标题左右两边平衡线

    <html> <div class="title"> <div class="line"></div> < ...

  10. CSS制作环形进度条

    参考来源 <Radial progress indicator using CSS>,该文核心是用纯CSS来做一个环形的进度条.纯css的意思就是连百分比这种数字,都是css生成的.文章作 ...