• 并发编程


    1.开启线程的两种方式:
      进程,线程:
       进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合)而线程才是cpu上的执行单位)
       1.同一个进程内的多个线程共享该进程内的地址资源
      2.创建线程的开销远小于创建进程的开销(创建一个进程,就是创建一个车间,涉及到申请空间,
      而且在该空间内建至少一条流水线,但创建线程,就只是在一个车间内造一条流水线,无需申请空间,所以创建开销小)
     1 # 方式1:
     2 from threading import Thread
     3 import time
     4 
     5 def sayhi(name):
     6     time.sleep(2)
     7     print('%s say hello'%name)
     8 
     9 if __name__ == "__main__":
    10     t=Thread(target=sayhi,args=('alice',))
    11     t.start()
    12     print('主线程')  # 一个进程,一个主线程,开启了一个线程
    13 
    14 # 方式2:
    15 from threading import Thread
    16 import time
    17 
    18 class Sayhi(Thread):
    19     def __init__(self,name):
    20         super().__init__()
    21         self.name = name
    22 
    23     def run(self):
    24         time.sleep(2)
    25         print('%s say hello'%self.name)
    26 
    27 if __name__ == "__main__":
    28     t = Sayhi('alice')
    29     t.start()
    30     print('主线程')

    2.进程与线程的区别:

      1.开进程的开销远大于开线程
      2.同一进程内的多个线程共享该进程的地址空间
      3.瞅一眼pid
     1 # 1.
     2 import time
     3 from threading import Thread
     4 from multiprocessing import Process
     5 
     6 def piao(name):
     7     print('%s piaoing' %name)
     8     time.sleep(2)
     9     print('%s piao end' %name)
    10 
    11 if __name__ == '__main__':
    12     # p1=Process(target=piao,args=('egon',))
    13     # p1.start() # 发出去后,没有立刻反应 开进程开销大
    14 
    15     t1=Thread(target=piao,args=('egon',))
    16     t1.start()  # 发出去后,立刻就反应了,开线程开销小
    17 
    18     print('主线程')
    19 """
    20 主线程
    21 egon piaoing
    22 egon piao end
    23 """
    24 """
    25 egon piaoing
    26 主线程
    27 egon piao end
    28 """
    29 # 2.
    30 from threading import Thread
    31 from multiprocessing import Process
    32 
    33 n=100
    34 def task():
    35     global n
    36     n=0
    37 
    38 if __name__ == '__main__':
    39     # p1=Process(target=task)
    40     # p1.start()
    41     # p1.join() # 彼此隔离的 n = 100
    42 
    43     t1=Thread(target=task)
    44     t1.start()
    45     t1.join()  # 共享地址空间 n = 0
    46 
    47     print('主线程',n)
    48 """
    49 主线程 100 
    50 """
    51 """
    52 主线程 0 
    53 """
    54 # 3.
    55 from threading import Thread
    56 from multiprocessing import Process,current_process
    57 import os
    58 
    59 def task():
    60    print(current_process().pid)
    61    print(os.getpid(),os.getppid())
    62 
    63 if __name__ == '__main__':
    64     # p1=Process(target=task)
    65     # p1.start()  # pid 不一样
    66     # p1.join()
    67 
    68     t1=Thread(target=task)
    69     t1.start()  # 线程pid 一样
    70     t1.join()
    71 
    72     print('主线程',current_process().pid)
    73     print('主线程',os.getpid(),os.getppid())
    74 """
    75 38780
    76 38780 43168
    77 主线程 43168
    78 主线程 43168 12480
    79 """
    80 """
    81 58912
    82 58912 12480
    83 主线程 58912
    84 主线程 58912 12480
    85 """

    3.Thread对象的其他属性或方法:
      currentThread().getName()
      t.setName()
      t.is_alive()
      t.isAlive()
      t.join()
      active_count()
      enumerate()
     1 from threading import Thread,currentThread,active_count,enumerate
     2 import time
     3 
     4 def task():
     5     print('%s is running'%currentThread().getName())
     6     time.sleep(2)
     7     print('%s is done'%currentThread().getName())
     8 
     9 if __name__ == "__main__":
    10     t = Thread(target=task,name='子线程1')
    11     t.start()
    12     # t.join()
    13     # print(t.getName())
    14     # t.setName('儿子线程1')
    15     # currentThread().setName('主进程')
    16     # print(t.is_alive())
    17     # print(t.isAlive())
    18     # print('主线程:',currentThread().getName())
    19     t.join()
    20     # print(active_count())  # 2 没有join 1 有join
    21     print(enumerate())  # [<_MainThread(MainThread, started 41144)>]
    22 
    23 
    24 """
    25 Thread-1 is running
    26 Thread-1
    27 主线程 MainThread
    28 Thread-1 is done
    29 """
    30 """
    31 子线程1 is running
    32 子线程1
    33 主线程 MainThread
    34 子线程1 is done
    35 """
    36 """
    37 子线程1 is running
    38 主线程 MainThread
    39 儿子线程1 is done
    40 """
    41 """
    42 子线程1 is running
    43 主线程: 主进程
    44 子线程1 is done
    45 """
    46 """
    47 子线程1 is running
    48 子线程1 is done
    49 False
    50 False
    51 主线程: MainThread
    52 """

    4.守护线程:
      一个进程什么时候被销毁,
    1.不开线程,代码完毕,该进程就被销毁
    2.主线程等到所有子线程死了后,他才死
    守护线程等到所有的子线程死了后,他才死
     1 from threading import Thread
     2 import time
     3 
     4 def sayhi(name):
     5     time.sleep(2)
     6     print('%s say hello' %name)
     7 
     8 if __name__ == '__main__':
     9     t=Thread(target=sayhi,args=('egon',))
    10     # t.setDaemon(True) #必须在t.start()之前设置
    11     t.daemon=True
    12     t.start()
    13 
    14     print('主线程')
    15     print(t.is_alive())  # t 跟着死了 一个线程内没有开启非守护线程
    16 """
    17 主线程
    18 True
    19 """
    20 
    21 from threading import Thread
    22 import time
    23 
    24 def foo():
    25     print(123)
    26     time.sleep(4)
    27     print("end123")
    28 
    29 def bar():
    30     print(456)
    31     time.sleep(3)
    32     print("end456")
    33 
    34 if __name__ == '__main__':
    35     t1=Thread(target=foo)
    36     t2=Thread(target=bar)
    37 
    38     t1.daemon=True
    39     t1.start()
    40     t2.start()
    41     print("main-------")
    42 """
    43 123    foo time.sleep(1)
    44 456
    45 main-------
    46 end123
    47 end456
    48 """
    49 """
    50 123     foo time.sleep(4)
    51 456
    52 main-------
    53 end456
    54 """
  • 相关阅读:
    快速排序算法
    DirectX9(翻译):介绍
    奇葩的面试题
    新博客
    OpenCV2:幼儿园篇 第八章 视频操作
    编程规范:位运算
    编程规范:allocator
    深浅copy和浅copy
    模块和包
    递归函数
  • 原文地址:https://www.cnblogs.com/alice-bj/p/8708062.html
Copyright © 2020-2023  润新知