练习(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 并发拷贝文件,保持目录结构。
  • 质数求和:用进程池并发执行并且统计时间。
posted on 2025-07-03 23:52  burgess0x  阅读(10)  评论(0)    收藏  举报