zoukankan      html  css  js  c++  java
  • python之《线程与进程》

    多线程的应用场景 不适用cpu操作密集型任务, 适合io操作密集型任务

    同一进程中的数据是互通的,因为python多线程是假多线程,我们要用到多核就需要开多个进程来实现,但是坏处是数据不能互通

    线程:是操作系统最小的调度单位,是一串指令的集合

    进程:eg:QQ要以一个整体的形式暴露给操作系统管理,里面包含对各种资源的调用,内存对各种资源管理的集合叫做进程

    进程操作cpu必须先创建一个线程,只有线程才能操作cpu

    所一在同一进程中的线程是共享同一片内存空间的,但是两个线程不能在同一块空间里运作

    主线程和子线程运行是并行的

    import threading
    import time
    def run(name):
        print('in the %s' % name)
        time.sleep(2)

    首先我们设置一个函数我们开启两个线程

    t2 = threading.Thread(target=run,args=('t2',))
    t1 = threading.Thread(target=run,args=('t1',))
    t1.start()
    t2.start()

    你就会看到 并行的结果了,可是出现了一个问题 我们向要在进程结束后使用其结果该怎么办呢?

    我们可以使用join哦

    star_time = time.time()
    
    r_obj = []
    for i in range(50):
        t = threading.Thread(target=run, args=('t %s' % i, ))
        t.setDaemon(True)  # 把子线程设置成守护线程
        t.start()
    
        r_obj.append(t)
    for i in r_obj:
        i.join()

    可以看到我们把每一个进程丢进了数组,来是他们结束那么后面我们就可以达到效果了

    顺便提一下我们还有一个使用类的方法来开多进程哦

    # class Mythraed(threading.Thread):
    #     def __init__(self,name):
    #         super(Mythraed, self).__init__()
    #         self.name = name
    #
    #     def run(self):
    #         print('run the %s',self.name)
    #         time.sleep(2)
    
    # t1 = Mythraed('t1')
    # t2 = Mythraed('t2')
    # t1.start()
    # t2.start()

     注意 python的线程是调用操作系统的源生线程,python在一时间内只能在一核中运行

    如果你是2.x记得加锁哦不然会出现差错

    local = threading.local()  # 加锁首先生成实例
    def run(name):
        global num
        local.acquire()  # 上锁
        num += 1
        local.release()  # 解锁
        print('in the %s' % name)

     2.进程(multiprocessing)

     同理进程也和线程一样的开启方式,也是start一下 也可以join

        for i in range(10):
           p = multiprocessing.Process(target=run, args=('liu%s' % i,))
           p.start()

    需要注意的是,每个进程都有一个父进程衍生出来,所以 查看进程的pid可以用os来查看,

    如果你用pycharm写了一个程序那么这个程序的父亲进程pid就是pychram在电脑中的pid

    查看父亲进程用

    os.getppid()

    查看当前进程的pid用

    os.getpid()
  • 相关阅读:
    主线程等待子线程结束再做响应
    前端开发注意细节
    XSS攻击前端需注意
    移动端开发碰到一个坑
    连续改变Chrome浏览器窗口大小,可以导致内存泄漏
    js中使用使用原型(prototype)定义方法的好处
    父节点使用css的transform: translate(0, 0)时position:fixed在chrome浏览器中无效
    CSS 中的 em单位
    观察者模式和发布/订阅模式的区别
    搜索练习4
  • 原文地址:https://www.cnblogs.com/BookMiki/p/10200895.html
Copyright © 2011-2022 走看看