zoukankan      html  css  js  c++  java
  • 多线程,多进程(2)

    1.多线程等待

    import threading,time

    def run():

             # time.sleep(3)

             print('哈哈哈')

    start_time = time.time()

    threads = []  #存放启动的5个线程

    for i in range(5):

             t = threading.Thread(target=run)  #五个线程每个都不一样,分别独立

             t.start()#

             threads.append(t)

    for lyl in threads:  #主线程循环等待5个子线程执行结束

             lyl.join()      #主线程依次等待子线程,join()就是等待方法。

    end_time = time.time()

    print('run_time..',end_time-start_time)

    #######

    主线程: 默认有个主线程

    子线程:主线程启动子线程

    问题??  如果这个函数里面有返回值的话,怎么获取呢?

       子线程运行的函数,如果里面有返回值的话,是不能获取到的     只能在外面定义一个list或者字典来存每次处理的结果。

    通常情况下 电脑CPU有几核,那么只能同时运行几个线程。但是呢,python的多线程,只能利用一个CPU的核心。(这个是py设计时的缺点)

    2.线程锁

     GIL  称为 全局解释器锁。

    锁呢就是,在多个线程同时修改一个数据的时候,可能会把数据覆盖,在python2里面需要加锁。

     python3里面不加锁也无所谓,默认会自动帮你加锁

    import threading,time

    num = 1

    lock = threading.Lock()  #申请一把锁

    def run():

             time.sleep(1)

             global num

             lock.acquire() #加锁  acquire()

             num+=1

             lock.release() #解锁  release()

    ts = []

    for i in range(100):

             t = threading.Thread(target=run)

             t.start()

             ts.append(t)

    [t.join() for t in ts]   #使用列表生成式进行等待

    print(num)

    3.守护线程

    只要主线结束,那么子线程立即结束,不管子线程有没有运行完成

    import threading,time

     def run():

             time.sleep(3)

             print('哈哈哈')

    for i in range(50):

             t = threading.Thread(target=run)

             t.setDaemon(True) #把子线程设置成为守护线程   t.setDaemon(True)

             t.start()

    print('Done,运行完成。')

    time.sleep(3) #如果不等待就直接Done,运行完成后就完了

    4.多进程

    import multiprocessing,threading    #导入多进程模块

    def my():

             print('哈哈哈') 

    def run(num):

             for i in range(num):

                       t = threading.Thread(target=my)

                       t.start()

    if __name__ == '__main__':                  #启动多进程必须加这个,模块要求

             for i in range(5):

                       p = multiprocessing.Process(target=run,args=(6,))  #启动一个进程,进程中添加线程(这里通过run函数调用多线程)对于run中参数有args给出,但是当有一个参数的时候

    格式一定要加,号,比如args=(6,)。这句会执行5个进程,每个进程会有6个线程。

                       p.start()

    5.关于多进程和多线程的选择??

    多进程

               多用于处理CPU密集型任务,比如需要计算能力

    多线程

                多用于IO密集型任务   不需要占用cpu,只是简单需要安排调度一下就可。

                Input Ouput

  • 相关阅读:
    Qt自定义一个事件类型
    Qt正则表达式限制输入
    QtQuick随笔
    右值引用示例
    虚函数习题复习
    实现基于IOCP的回声服务器端
    以纯重叠I/O方式实现回声服务器端(windows)
    使用事件对象(重叠I/O)
    pipe mmap
    ubuntu下压缩和解压缩的命令用法
  • 原文地址:https://www.cnblogs.com/cslw5566/p/9107973.html
Copyright © 2011-2022 走看看