day08/thread1.py
"""
thread1.py 线程创建
步骤: 1. 封装线程函数
2. 创建线程对象
3. 启动线程
4. 回收线程
"""
import threading
from time import sleep
import os
a = 1
# 线程函数
def music():
for i in range(3):
sleep(2)
print(os.getpid(),"播放:我和我的祖国")
global a
print("a = ",a)
a = 10000
# 创建线程对象
t = threading.Thread(target=music)
t.start() # 启动线程
for i in range(2):
sleep(4)
print(os.getpid(),"播放:五星红旗")
t.join() # 回收线程
print("a:",a)
"""
thread2.py 线程函数传参
"""
from threading import Thread
from time import sleep
# 含有参数线程函数
def fun(sec,name):
print("线程函数参数")
sleep(sec)
print("%s执行完成"%name)
# 创建多个线程
jobs = []
# 创建5个线程
for i in range(5):
t = Thread(target=fun,args=(2,),
kwargs={'name':'T%d'%i})
jobs.append(t)
t.start()
for i in jobs:
i.join()
"""
线程属性说明thread_attr.py
"""
from threading import Thread
from time import sleep
def fun():
print("============")
sleep(3)
print("线程属性测试")
t = Thread(target = fun)
t.setDaemon(True) # 主线程退出分支线程也退出
t.start()
print("Name:",t.getName()) # 线程名称
print("is Alive:",t.is_alive()) # 是否在生命中期
print("daemon:",t.isDaemon()) # daemon属性值
day7/myThread.py
from threading import Thread
from time import sleep,ctime
class MyThread(Thread):
def __init__(self,target=None,args=(),kwargs={}):
super().__init__()
self.target = target
self.args = args
self.kwargs = kwargs
def run(self):
self.target(*self.args,**self.kwargs)
####################################################
def player(sec,song):
for i in range(3):
print("Playing %s: %s"%(song,ctime()))
sleep(sec)
t = MyThread(target = player,args=(3,),
kwargs={'song':'凉凉'})
t.start()
t.join()
day8/thread_event.py
"""
Event 互斥方法
"""
from threading import Thread,Event
s = None # 用于通信
e = Event() # event对象
def 杨子荣():
print("杨子荣前来拜山头")
global s
s = "天王盖地虎"
e.set() # 解除wait阻塞
t = Thread(target=杨子荣)
t.start()
print("说对口令就是自己人")
e.wait() # 阻塞等待说口令
if s == '天王盖地虎':
print("宝塔镇河妖")
print("确认过眼神,你是对的人")
else:
print("打死他....")
t.join()
day8/thread_lock.py
"""
lock 互斥方法演示
"""
from threading import Thread,Lock
a = b = 0
lock = Lock() # 线程锁
def value():
while True:
lock.acquire() # 上锁
if a != b:
print("a = %d,b = %d"%(a,b))
lock.release() # 解锁
t = Thread(target=value)
t.start()
while True:
with lock: # 上锁
a += 1
b += 1
# 自动解锁
t.join()
day8/dead_lock.py
from time import sleep
from threading import Thread,Lock
# 账户类
class Account:
def __init__(self,id,balance,lock):
self.id = id # 账户名
self.balance = balance # 存款
self.lock = lock # 锁
# 取钱
def withdraw(self,amount):
self.balance -= amount
# 存钱
def deposit(self,amount):
self.balance += amount
# 查看余额
def get_balance(self):
return self.balance
# 两个账户
Tom = Account('Tom',5000,Lock())
Alex = Account('Alex',8000,Lock())
# 转账
def transfer(from_,to,amount):
if from_.lock.acquire():
from_.withdraw(amount) # from_钱减少
sleep(0.1)
# 两个线程都阻塞在to上锁位置
if to.lock.acquire():
to.deposit(amount) # to 钱增加
to.lock.release()
from_.lock.release()
print("%s给%s转了%d"%(from_.id,to.id,amount))
t1 = Thread(target = transfer,args=(Tom,Alex,2000))
t2 = Thread(target = transfer,args=(Alex,Tom,1800))
t1.start()
t2.start()
t1.join()
t2.join()
"""
exc1
使用多个线程从不同的地方拷贝一个文件
每个线程负责拷贝文件的一部分
"""
from threading import Thread
import os
urls = ["/home/tarena/桌面/",
"/home/tarena/文档/",
"/home/tarena/图片/",
"/home/tarena/下载/",
"/home/tarena/视频/",
"/home/tarena/音乐/"
]
# 输入要下载的文件,判断urls列表中哪些地方有这个文件
# os.path.exists()
filename = input("要下载的文件:")
exp = [] # 存放有该文件的路径
for i in urls:
if os.path.exists(i+filename):
exp.append(i+filename)
path_num = len(exp) # 表示一共有几处可以拷贝
if path_num == 0:
print("没有资源")
os._exit(0)
# 获取文件大小,确定每个线程下载多少
file_size = os.path.getsize(exp[0])
block_size = file_size // path_num + 1
# 创建若干线程,每个线程拷贝一部分,拷贝过程封装为线程函数
def load(path,num):
# path: 从哪个路径拷贝
# num:拷贝的是第几块
fw = open(str(num)+filename,'wb')
f = open(path,'rb')
f.seek(block_size*(num - 1),0)
n = block_size
while True:
if n < 1024:
data = f.read(n)
fw.write(data)
break
else:
data = f.read(1024)
fw.write(data)
n -= 1024
fw.close()
f.close()
num = 1
jobs = []
for path in exp:
t = Thread(target=load,args=(path,num))
jobs.append(t)
t.start()
num += 1
for i in jobs:
i.join()
# 将多个文件拼接到一起
fw = open(filename,'wb')
for i in range(1,path_num+1):
f = open(str(i)+filename,'rb')
while True:
data = f.read(1024)
if not data:
break
fw.write(data)
os.remove(str(i)+filename)
"""
使用多个线程从不同的地方拷贝一个文件
每个线程负责拷贝文件的一部分
"""
from threading import Thread,Lock
import os
from time import sleep
urls = ["/home/tarena/桌面/",
"/home/tarena/文档/",
"/home/tarena/图片/",
"/home/tarena/下载/",
"/home/tarena/视频/",
"/home/tarena/音乐/"
]
lock = Lock() # 锁
# 输入要下载的文件,判断urls列表中哪些地方有这个文件
# os.path.exists()
filename = input("要下载的文件:")
exp = [] # 存放有该文件的路径
for i in urls:
if os.path.exists(i+filename):
exp.append(i+filename)
path_num = len(exp) # 表示一共有几处可以拷贝
if path_num == 0:
print("没有资源")
os._exit(0)
# 获取文件大小,确定每个线程下载多少
file_size = os.path.getsize(exp[0])
block_size = file_size // path_num + 1
# 创建若干线程,每个线程拷贝一部分,拷贝过程封装为线程函数
fw = open(filename, 'wb')
def load(path,num):
# path: 从哪个路径拷贝
# num:拷贝的是第几块
f = open(path,'rb')
f.seek(block_size*(num - 1),0)
data = f.read(block_size)
with lock:
fw.seek(block_size*(num - 1),0)
sleep(0.1)
fw.write(data)
f.close()
num = 1
jobs = []
for path in exp:
t = Thread(target=load,args=(path,num))
jobs.append(t)
t.start()
num += 1
for i in jobs:
i.join()
"""
测试用例
"""
# 计算
def count(x,y):
c = 0
while c < 7000000:
x += 1
y += 1
c += 1
# io
def io():
write()
read()
def write():
f = open('test','w')
for i in range(1800000):
f.write("Hello world\n")
f.close()
def read():
f = open('test')
lines = f.readlines()
f.close()