zoukankan      html  css  js  c++  java
  • python中的多线程和多进程编程

    注意:多线程和多线程编程是不同的!!!

    第一点:一个进程相当于一个要执行的程序,它会开启一个主线程,多线程的话就会再开启多个子线程;

    第二点:python设计之初没有多核CPU,所以它的多线程是一种并发操作(伪并行),它相当于把CPU的时间片分成一段一段很小的片段,然后分给各个线程交替进行,由于每个片段都很短,所以看上去像平行操作;

    举个例子:现在有一个16核的CPU,一个要执行的数据读取任务A,我们将A分成多个进程并行操作,每个进程放到一个核上;但是如果将这个任务A用一个进程(开多个线程)完成的话,虽然一个核心同一时间处理一个线程,按理说16核可以同时处理16个线程(未考虑超线程技术),但由于python的缺陷,这里面的多线程依然是并发(伪并行)的,所以效率低;

    (1)多线程操作案例:

    import threading
    
    class MyThread(threading.Thread):
        def __init__(self , thread_ID , thread_name , person_list):
            threading.Thread.__init__(self)
            self.thread_ID = thread_ID
            self.thread_name = thread_name
            self.person_list = person_list
        def run(self):
            print("开始进程:" + self.thread_name)
            main(self.person_list , self.thread_name)  #main是自定义要进行多线程操作的函数
            print("结束进程:" + self.thread_name)
    
    def main(person_list , thread_name):
        ......
    #multi-thread
    multi_thread = []
    for i in range(THREAD_NUM):
    multi_thread.append(MyThread(i , "Thread_" + str(i) , person_per_thread[i]))
    for i in range(THREAD_NUM):
    multi_thread[i].start() #start只是开启了多线程,之后会自动发起线程模块中的run操作;
    print("{} start!".format(time.ctime(time.time())))
    for i in range(THREAD_NUM):
    multi_thread[i].join() #join()是为了保证主线程在多线程开启的子线程都结束后再结束,这样子可以防止主线程在子线程结束前结束,一般join都和start配合使用

     (2)多进程操作案例:

    可以直接使用python库:Pool进程池;

    from multiprocessing import Pool , freeze_support
    
    #multi-processing
        freeze_support()
        pool = Pool(PROCESS_NUM)
        for i in range(PROCESS_NUM):
            pool.apply_async(func = main , args = (person_per_thread[i] , str(i) , ))
        #main是自定义的要进行多进程编程的函数
        pool.close()
        pool.join()
  • 相关阅读:
    bzoj 1069 凸包+旋转卡壳
    bzoj 3203 凸包+三分
    bzoj 3779 重组病毒 好题 LCT+dfn序+线段树分类讨论
    bzoj 3881 [Coci2015]Divljak fail树+树链的并
    bzoj 4034 [HAOI2015]树上操作 入栈出栈序+线段树 / 树剖 维护到根距离和
    bzoj 2819 Nim dfn序+树状数组维护区间异或值
    bzoj 4031 [HEOI2015]小Z的房间 Matrix-tree定理
    BZOJ3676: [Apio2014]回文串
    BZOJ2434: [Noi2011]阿狸的打字机
    BZOJ2553: [BeiJing2011]禁忌
  • 原文地址:https://www.cnblogs.com/zf-blog/p/10772879.html
Copyright © 2011-2022 走看看