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

被折叠的 条评论
为什么被折叠?



