o1什么是进程.py

 1 import multiprocessing
 2 import threading
 3 """
 4 复习
 5 1,线程轻量级,解决单任务的问题,可以同时执行多个函数,线程执行顺序不一定,子线程执行完毕后才会结束主线程
 6 2,线程之间全局变量共享,同时读写容易出错,可以使用Lock类创建进行加锁,或者超时控制,注意防止死锁
 7 """
 8 """
 9 进程,进程是程序运行后的一种形态,可以调用各种系统资源,实现多任务的另外一种方式
10 但是进程完成多任务占用资源相当大,进程创建后,主进程所有东西都会被子进程复制一份    
11 进程的模块multiprocessing 
12 
13 进程的状态   运行--就绪--等待--死亡
14 进程的创建   multiprocessing.Porcess类创建对象,调用对象start方法与线程非常相似
15 
16 进程是资源分配的单位,线程是在进程中运行,
17 
18 先多线程,多线程无法满足在执行多进程
19 
20 """
21 # 现有进程-再有线程,多线程的意思是在一个进程中实现多个线程
22     # 而多进程是开启多个进程,多个进程中每个进程可以包含多个线程
23 """
24 
25 def test1():
26     for i in range(1000):
27         print('test1')
28 def test2():
29     for i in range(1000):
30         print('test2')
31 
32 def  main():
33     t1 = threading.Thread(target=test1)
34     t2 = threading.Thread(target=test2)
35     t1.start()
36     t2.start()
37 
38 if __name__ == '__main__':
39     main()
40 """
41 
42 def test1():
43     while True:
44         print('test1')
45 def test2():
46     while True:
47         print('test2')
48 
49 def  main():
50     #  创建进程
51     p1 = threading.Thread(target=test1)
52     p2 = threading.Thread(target=test2)
53     p1.start()
54     p2.start()
55 
56 if __name__ == '__main__':
57     main()
View Code

o2_进程之间的通信.py

 1 import multiprocessing
 2 #  Learner BM
 3 ""
 4 """
 5 1,进程之间的通信方式,1,使用套接字网络通信.2,使用硬盘文件进行读写通信,但效率太低.3,使用内存之间进行通信,队列
 6 
 7 队列
 8 
 9 Queue,系统中的一部分内存空间multiprocessing模块
10 q= QUeue(3)   创建一个队列,存储3个消息 ,先进先出,后进后出
11 q.full()        查看队列是否满了  bollean类型返回值
12 q.enpty()       查看队列是否清空  bollean类型返回值
13 q.put()        存放数据,类型任意
14 q.get()        取出数据
15 """
16 """
17 通信步骤
18 1,创建队列
19 2,创建进程
20 3,将队列当做参数,传递到进程当中
21 4,调用进程
22 """
23 def down(q1):
24     #  举例,下载的列表
25     down_data = [11,22,33]
26     #  遍历列表
27     for i in down_data:
28         # 放入数据
29         q1.put(i)
30     # 打印
31     print('下载完毕,交给analyze处理')
32 def analyze(q1):
33     # 定义列表,用于存储get到的数据
34     list1 = list()
35     while True:       # 循环取出数据
36         # get数据存入data
37         data = q1.get()
38         # data存入list中
39         list1.append(data)
40         #  如果对列为空,结束循环
41         if q1.empty():
42             break
43     print('analyze完毕,结果是%s' % list1)
44     #q1.get()
45     print(q1.get())
46 def main():
47     #  定义队列
48     q1= multiprocessing.Queue()
49     #  定义进程,target目标,与args多值参数与线程 threading 一致
50     p1 = multiprocessing.Process(target=down,args=(q1,))
51     p2 = multiprocessing.Process(target=analyze,args=(q1,))
52     #  启动进程
53     p1.start()
54     p2.start()
55 if __name__ == '__main__':
56     main()
View Code

o3_进程池.py

import multiprocessing
import os
import time
import random
#  Learner BM
""
"""
多进程实现多任务,但是并不是进程越多越好,当任务数量不固定的时候,因此可以通过创建进程池,实现进程之间的调配
进程池,通过创建进程池,存储创建的进程,通过合理调配,实现以少量的进程完成不同的任务
注意,进程池与进程不同
    进程,等待子进程执行完毕在执行后续代码
    进程池,不会等待子进程完毕,所以需要人为控制,使用join()方法,等待子进程执行完毕

# 创建进程池 ,注意windows下进程池的创建调用必须在main()函数下,否则会报错

def main():
    创建进程池,包含3个进程
    po = multiprocessing.Pool(3)
    
    配合for 循环,设置def需要执行的次数
    for i in range(0, 10):
        po.apply_async(demo, (i,))

    po.close()
    po.join()


"""
def demo(msg):
    for i in  range(random.randint(1,10000)):
        print('这是第%s进程执行任务%s任务' % (msg,i))
    # t_start = time.time()
    # print('%s开始执行,进程号为%d' % (msg,os.getegid()))
    # time.sleep(random.random()*2)
    # t_stop = time.time()
    # print(msg,'执行完毕,耗时%0.2f' % (t_stop-t_start))
"""
注意,win下
"""
def main():

    po = multiprocessing.Pool(3)

    for i in range(0, 10):
        po.apply_async(demo,(i,))


    po.close()
    po.join()

if __name__ == '__main__':
    main()
View Code

o4_多进程文件复制.py

import os
import multiprocessing
""""""
"""
1,进程池的创建必须配合close方法和join方法使用
2,进程池任务的添加,一般配合for循环,循环遍历
3,进程池内部调用的函数出错,不会输出任何信息


"""

#
def copy(file_name,old_floder,new_floder):
    #  组合文件名及路径,
    old_path_name = str(old_floder +'/'+ file_name)
    # 打开文件,参数为文件名及路径,
    f_old = open(old_path_name,'r',encoding='utf-8')
    text=f_old.read()

    # #读取文件
    new_path_name = str(new_floder +'/'+ file_name)
    f_new = open(new_path_name,'w',encoding='utf-8')
    f_new.write(text)
    f_new.close()
    f_old.close()

def main():

    # 获取用户需要拷贝文件夹的名字
    old_floder=input('请输入需要拷贝的目录文件名')
    # 创建新的文件夹

    new_floder = old_floder+'[附件]'
    os.mkdir(new_floder)
    print(new_floder)


    # 获取文原件夹内部文件的名字  os.listdir
    file_names = os.listdir(old_floder)

    # 多任务创建进程池,必须配合close和join方法,否则无法显示进程执行步骤
    po = multiprocessing.Pool(3)

    for filename in file_names:
                            #参数 文件名,源文件夹,目标文件夹
        po.apply_async(copy,args=(filename,old_floder,new_floder))

        # 复制原文件夹中文件到新文件夹中去copy函数执行
    # 必须配合close和join
    po.close()
    po.join()

if __name__ == '__main__':
    main()
View Code

 

posted on 2020-03-22 19:48  RRRRRRR1  阅读(6)  评论(0)    收藏  举报