练习(4)的参考代码
练习(4)的参考代码
#!/usr/bin/env python
import threading
#定义条件变量,来控制线程的交替执行
condition = threading.Condition()
#定义标志位来控制线程的执行顺序
flag = True
def printNums():
global flag
for i in range(1,53,2):
with condition:
while not flag:
condition.wait()
print(str(i)+str(i+1),end='')
flag = False
condition.notify()
def printLetters():
global flag
for i in range(65,91):
with condition:
while flag:
condition.wait()
print(chr(i))
flag = True
condition.notify()
def main():
t1 = threading.Thread(target=printNums)
t2 = threading.Thread(target=printLetters)
t1.start()
t2.start()
t1.join()
t2.join()
if __name__ == '__main__':
main()
运行结果
┌──(root㉿kali)-[~/python_code/python_4/homework]
└─# python 1.py
12A
34B
56C
78D
910E
1112F
1314G
1516H
1718I
1920J
2122K
2324L
2526M
2728N
2930O
3132P
3334Q
3536R
3738S
3940T
4142U
4344V
4546W
4748X
4950Y
5152Z
#!/usr/bin/env python
import argparse
import os
import shutil
from multiprocessing import Pool
from functools import partial
def copy_file(src_file,source_dir,dest_dir):
#计算目标路径(保留目录结构)
relative_path = os.path.relpath(src_file,source_file)
dest_file = os.path.join(dest_dir,relative_path)
#创建目标路径的目录(检查目录是否存在)
os.makedirs(os.path.dirname(dest_file),exist_ok = True)
#拷贝文件(保留元数据)
shutil.copy2(src_file,dest_file)
def main():
#解析命令行参数
parser = argparse.ArgumentParser(description='备份文件使用4个进程')
parser.add_argument('-s','--source',required=True,help='源文件目录')
parser.add_argument('-d','--dest',required=True,help='目标文件目录')
args = parser.parse_args()
source_dir = args.source
dest_dir = args.dest
#收集源目录下的全部文件
files = []
for filedir,_,filenames in os.walk(source_dir):
for filename in filenames:
files.append(os.path.join(filedir,filename))
#使用四个进程并发拷贝目录
with Pool(process = 4) as pool:
pool.map(partial(copy_file,source_dir=source_dir,dest_dir=dest_dir),files)
if __name__ == '__main__':
main()
运行结果
┌──(root㉿kali)-[~/python_code/python_4/homework]
└─# ls
1.py 2.py
┌──(root㉿kali)-[~/python_code/python_4/homework]
└─# python 2.py -s ./ -d ./test
┌──(root㉿kali)-[~/python_code/python_4/homework]
└─# ls
1.py 2.py test
┌──(root㉿kali)-[~/python_code/python_4/homework]
└─# cd test
┌──(root㉿kali)-[~/python_code/python_4/homework/test]
└─# ls
1.py 2.py
#!/usr/bin/env python
from multiprocessing import Process,Pool
import time
sum = 0
def run():
for i in range(1,1000001):
for j in range(i//2):
if i / j == 0:
continue
sum += i
p = Process(target=run)
def timeis(func):
def log(*args,**kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print('程序运行耗时:{:.2f}'.format(end_time - start_time))
return result
return log
@timeis
def process_1():
pool1 = Pool(4)
pool1.apply_async(p)
pool1.close()
pool1.join()
@timeis
def process_2():
pool2 = Pool(10)
pool2.apply_async(p)
pool2.close()
pool2.join()
if __name__ == '__main__':
process_1()
process_2()
运行结果
┌──(root㉿kali)-[~/python_code/python_4/homework/test]
└─# python 3.py
程序运行耗时:0.02
程序运行耗时:0.01
总结
- 线程同步:通过 threading.Condition 和标志位控制两个线程交替输出。
- 多进程文件拷贝:使用 multiprocessing.Pool 并发拷贝文件,保持目录结构。
- 质数求和:用进程池并发执行并且统计时间。
浙公网安备 33010602011771号