python爬虫学习-线程Thread

本文详细介绍线程的两种使用方式:面向过程和面向对象,包括线程的启动、参数传递及等待机制。同时,深入探讨了线程同步中锁的使用,以及队列在多线程环境下的数据管理和操作,如队列的创建、数据的存储和取出,以及队列状态的判断。

线程Thread


面向过程:
t=threading.Thread(target=sing,name=“唱歌”,args=(g,))
target:线程启动后要执行的函数
name:线程的名字,threading.current_thread().name
args:主线程向子线程传递的参数
t.start() 启动
t.join() 让主线程等待子线程结束后再结束

# 创建一个主线程,两个子线程(唱歌,跳舞)
# *******************************************************************************
import time
import threading
def sing(g):
	for x in range(1,10):
		print('线程 %s:我在唱歌:%s!(%d)'%(threading.current_thread().name,g,x))
		time.sleep(1)

def dance(w):
	for x in range(1,10):
		print('线程 %s:我在跳舞:%s!(%d)'%(threading.current_thread().name,w,x))
		time.sleep(1)

def main():
	g='沙漠骆驼'
	w='钢管舞'
	tsing=threading.Thread(target=sing,name="唱歌",args=(g,))
	tdance=threading.Thread(target=dance,name="跳舞",args=(w,))
	tsing.start()
	tdance.start()
	#让主线程等待子线程结束后在接收
	tsing.join()
	tdance.join()
	for x in range(1,10):
		print('这个是主线程!%s'%x)
		time.sleep(1)

if __name__ == '__main__':
	main()

面向对象:
定义一个对象继承自threading.Thread,重新一个run方法,需要线程名称,传递参数的话,需要重写构造方法

import threading
import time

# 写一个类,继承自threading.threading
class SingThread(threading.Thread):
	"""docstring for MyThread"""
	def __init__(self,name,a):
		super().__init__()
		self.name=name
		self.a=a

	def run(self):
		for x in range(1,10):
			print('线程名字: %s,我在唱的歌曲是:%s(%d)'%(self.name,self.a,x))
			time.sleep(1)
		
class DanceThread(threading.Thread):
	"""docstring for MyThread"""
	def __init__(self,name,a):
		super().__init__()
		self.name=name
		self.a=a

	def run(self):
		for x in range(1,10):
			print('线程名字: %s,我在跳的舞是:%s(%d)'%(self.name,self.a,x))
			time.sleep(1)
		
def main():
	tsing=SingThread("唱歌","七里香")
	tdance=DanceThread("跳舞","广场舞")
	tsing.start()
	tdance.start()
	tdance.join()
	tsing.join()
	print('主线程和子线程全部结束')

if __name__ == '__main__':
	main()

线程同步:
线程之间共享数据,全局变量很容易造成数据紊乱问题,需要使用线程锁
创建锁:suo=threading.Lock()
上锁:suo.acquire()
释放锁:suo.release()


队列(queue)
爬虫,一个下载线程,一个解析线程
创建一个:q=Queue(5)
存储数据
q.put(f) #超出队列,后阻塞,程序卡在这里等待
q.put(‘f’,false)#如果队列满,则直接报错
q.put(‘f’,True,3)#如果队列满,则程序等待3秒,后报错
取数据:
print(q.get())#当数据取完后,程序卡在这里等待
print(q.get(false))#不等待,直接报错
print(q.get(True,3))#等3秒,后报错
q.empty() 判断是不是为空
q.full() 判断是不是已满
q.qsize()获取队列当前长度
简单实例:

# 队列
from queue import Queue

# 创建一个队列
q=Queue(5)
# 存数据
print(q.empty())
q.put('a')
q.put('b')
print(q.qsize())
q.put('c')
q.put('d')
q.put('e')
print(q.full())
print(q)
#**************************************************
# q.put(f)	#超出队列,后阻塞,程序卡在这里等待
# q.put('f',false)#如果队列满,则直接报错
# q.put('f',True,3)#如果队列满,则程序等待3秒,后报错
#**************************************************

print(q.get())
print(q.get())
print(q.get())

#**************************************************
# print(q.get())#当数据取完后,程序卡在这里等待
# print(q.get(false))#不等待,直接报错
# print(q.get(True,3))#等3秒,后报错
#**************************************************

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值