前言
昨天晚上9点多就睡了 2点起来没睡意。。。 那就学习吧emmmm ,拿起闲置几天的python课程学习。学习到现在5.58了 总结下 继续开始学习新的内容
多多线程?
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
多线程类似于同时执行多个不同程序,多线程运行有如下优点:
python多线程-引入threading模块
threading模块用于提供线程相关的操作,线程是应用程序中工作的最小单元。python当前版本的多线程库没有实现优先级、线程组,线程也不能被停止、暂停、恢复、中断。
threading模块提供的类:
Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, local
import threading
Python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的、原始的线程以及一个简单的锁。
threading 模块提供的其他方法:
除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:
python多线程-通过threading.Thread()创建线程
import threading import time def xiaohua(n): print("xiaohua:%s"%(n)) time.sleep(2)#增加延迟可以看到效果 #创建2个线程 t1=threading.Thread(target=xiaohua,args=(2,)) t2=threading.Thread(target=xiaohua,args=(3,)) #启动2个线程 t1.start() t2.start()
程序运行后,主线程从上到下依次执行,在t1,t2两个线程启动后,与主线程并行,抢占CPU资源。xiaohua函数内部我们增加了2秒的延迟 正常清空下我们执行依次xiaohua函数第一个print很快第二个print要等上两秒 此时我们用的是多线程 所以这两行结果同时打印。
python-Queue模块
Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。
Queue模块-FIFO队列
class Queue.Queue(maxsize=0)
FIFO即First in First Out,先进先出。Queue提供了一个基本的FIFO容器,使用方法很简单,maxsize是个整数,指明了队列中能存放的数据个数的上限。一旦达到上限,插入会导致阻塞,直到队列中的数据被消费掉。如果maxsize小于或者等于0,队列大小没有限制。
import queue Queue=queue.Queue() for i in range(6): Queue.put(i) while not Queue.empty(): print(Queue.get())
执行结果
Queue模块-LIFO队列
class Queue.LifoQueue(maxsize=0)
LIFO即Last in First Out,后进先出。与栈的类似,使用也很简单,maxsize用法同上
import queue Queue=queue.LifoQueue() for i in range(6): Queue.put(i) while not Queue.empty(): print(Queue.get())
执行结果:
综合运用
# coding=utf-8 import threading, queue, time, urllib from urllib import request baseUrl = ‘http://www.pythontab.com/html/pythonjichu/‘ urlQueue = queue.Queue() for i in range(2,10): url=baseUrl+str(i)+‘.html‘ urlQueue.put(url) print(url) def fetchUrl(urlQueue): while True: try: url=urlQueue.get_nowait()#相当queue.get(False) i=urlQueue.qsize()#返回队列的大小 except Exception as e: break print(‘当前线程名%s,url:%s‘%(threading.currentThread().name,url)); try: response=urllib.request.urlopen(url) responseCode=response.getcode() except Exception as e: continue if responseCode==200: #抓取内容的数据处理可以放到这里 # #为了突出效果, 设置延时 time.sleep(1) if __name__==‘__main__‘: startTime=time.time() threads=[] threadNum=4 for i in range(0,threadNum): t=threading.Thread(target=fetchUrl,args=(urlQueue,)) threads.append(t) #将线程加入到容器 print(threads) for t in threads: t.start() for t in threads: t.join() endTime=time.time() print(‘time=%s‘%(endTime-startTime))
参考学习:https://www.cnblogs.com/tkqasn/p/5700281.html
https://www.runoob.com/python/python-multithreading.html
https://www.cnblogs.com/itogo/p/5635629.html
python-网络安全编程第五天(threading多线程模块&Queue模块)
原文:https://www.cnblogs.com/xhds/p/12220513.html