zoukankan      html  css  js  c++  java
  • #上节多线程内容回顾#多线程的使用场景 #多进程的基本使用

      

     1 #上节多线程内容回顾
     2 
     3 
     4 进程 至少包含一个 线程
     5 
     6 线程 内存共享
     7 线程同时修改同一份数据时必须加锁,mutex互斥锁
     8 递归锁
     9 join 等待一个线程结束
    10 
    11 #串行
    12 def run():
    13     print ('run thread...')
    14 
    15 for i in range(10):  #串行
    16     t = threading.Thread(target=run,args=(n,))
    17     t.start()
    18     t.join()
    19 
    20 
    21 #并行方法
    22 def run():
    23     print ('run thread...')
    24 
    25 t_res = []
    26 
    27 for i in range(10):  
    28     t = threading.Thread(target=run,args=(n,))
    29     t.start()
    30     t_res.append(t)
    31 
    32 for r in t_res:
    33     r.join()
    34 
    35 
    36 
    37 守护线程(slave)  服务于非守护线程(master)
    38 
    39 
    40 #守护线程
    41 def run():
    42     print ('run thread...')
    43 
    44 for i in range(10):  
    45     t = threading.Thread(target=run,args=(n,))
    46     t.setDaemon(True)
    47     t.start()
    48     
    49 print ('master is done...')
    50 
    51 
    52 
    53 queue队列
    54     解耦,使程序直接实现松耦合,
    55     提高处理效率,
    56 
    57     FIFO = first in first out   先进先出
    58     LIFO = last in first out    后进先出
    59         
    60    
    #上节多线程内容回顾

      

     1 #多线程的使用场景 #多进程的基本使用
     2 
     3 
     4 #io 操作不占用CPU (读取数据)
     5 
     6 #计算占用CPU , 1+1
     7 
     8 #python的多线程,不适合CPU密集操作型的任务,适合IO操作密集型的任务
     9 
    10 '''
    11 import multiprocessing
    12 import time
    13 
    14 from multiprocessing import Process
    15 
    16 def f(name):
    17     time.sleep(2)
    18     print('hello', name)
    19  
    20 if __name__ == '__main__':
    21     p = Process(target=f, args=('bob',))
    22     p.start()
    23     p.join()
    24 
    25 '''
    26 
    27 
    28 
    29 '''
    30 import multiprocessing
    31 import time
    32 
    33 def run(name):
    34     time.sleep(2)
    35     print('hello', name)
    36  
    37 if __name__ == '__main__':
    38     for i in range(10):
    39         p = multiprocessing.Process(target=run, args=('bob %s' %i,))
    40         p.start()
    41 
    42 
    43 '''
    44 '''
    45 import multiprocessing
    46 import time
    47 import threading
    48 
    49 def thread_run():
    50     print (threading.get_ident())
    51 def run(name):
    52     time.sleep(2)
    53     print('hello', name)
    54     t = threading.Thread(target=thread_run,)
    55     t.start()
    56     
    57 if __name__ == '__main__':
    58     for i in range(10):
    59         p = multiprocessing.Process(target=run, args=('bob %s' %i,))
    60         p.start()
    61 
    62 '''
    #多线程的使用场景 #多进程的基本使用
     1 #get 进程ID
     2 
     3 from multiprocessing import Process
     4 import os
     5  
     6 def info(title):
     7     print(title)
     8     print('module name:', __name__)
     9     print('parent process:', os.getppid())
    10     print('process id:', os.getpid())
    11     print("
    
    ")
    12  
    13 def f(name):
    14     info('1mcalled from child process function f')
    15     print('hello', name)
    16  
    17 if __name__ == '__main__':
    18     info('1mmain process line')
    19     p = Process(target=f, args=('bob',))
    20     p.start()
    21     p.join()
    #get 进程ID
      1 #进程间数据交互#进程同步#进程池的使用 (信号量)
      2 
      3 #进程间通讯 
      4 #不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用以下方法:
      5 
      6 #Queues使用方法跟threading里的queue差不多
      7 
      8 '''
      9 #Queues  使用方法跟threading里的queue差不多
     10 from multiprocessing import Process, Queue
     11  
     12 def f(q):
     13     q.put([42, None, 'hello'])
     14  
     15 if __name__ == '__main__':
     16     q = Queue()
     17     p = Process(target=f, args=(q,))
     18     p.start()
     19     print(q.get())    # prints "[42, None, 'hello']"
     20     p.join()
     21 
     22 '''
     23 
     24 
     25 
     26 '''
     27 #Pipes方法
     28 
     29 from multiprocessing import Process, Pipe
     30  
     31 def f(conn):
     32     conn.send([42, None, 'hello'])
     33     conn.close()
     34  
     35 if __name__ == '__main__':
     36     parent_conn, child_conn = Pipe()
     37     p = Process(target=f, args=(child_conn,))
     38     p.start()
     39     print(parent_conn.recv())   # prints "[42, None, 'hello']"
     40     p.join()
     41 
     42 '''
     43 '''
     44 #Managers方法 默认加锁
     45 
     46 from multiprocessing import Process, Manager
     47 import os
     48 
     49 
     50 def f(d, l):
     51     d[1] = '1'
     52     d['2'] = 2
     53     d[0.25] = None
     54     l.append(os.getpid())
     55     print(l)
     56  
     57 if __name__ == '__main__':
     58     with Manager() as manager:
     59         d = manager.dict()#生成一个字典,可在多个进程间共享和传递
     60         l = manager.list(range(5))#生成一个列表,可在多个进程间共享和传递
     61         p_list = [] #用来存放等待全部进程的列表
     62         for i in range(10):
     63             p = Process(target=f, args=(d, l))
     64             p.start()
     65             p_list.append(p)
     66         for res in p_list:#等待结果
     67             res.join()
     68  
     69         print(d)
     70         print(l)
     71 '''
     72 '''
     73 #Managers方法 默认加锁
     74 
     75 from multiprocessing import Process, Manager
     76 import os
     77 
     78 def f(d, l):
     79     d[os.getpid()] = os.getpid()
     80     l.append(os.getpid())
     81     print(l)
     82  
     83 if __name__ == '__main__':
     84     with Manager() as manager:
     85         d = manager.dict()#生成一个字典,可在多个进程间共享和传递
     86         l = manager.list(range(5))#生成一个列表,可在多个进程间共享和传递
     87         p_list = [] #用来存放等待全部进程的列表
     88         for i in range(10):
     89             p = Process(target=f, args=(d, l))
     90             p.start()
     91             p_list.append(p)
     92         for res in p_list:#等待结果
     93             res.join()
     94  
     95         print(d)
     96         print(l)
     97 '''
     98 '''
     99 #进程同步
    100 
    101 from multiprocessing import Process, Lock
    102  
    103 def f(l, i): #锁,值
    104     #l.acquire()
    105     print('hello world', i)
    106     #l.release()
    107  
    108 if __name__ == '__main__':
    109     lock = Lock()
    110     for num in range(10):
    111         Process(target=f, args=(lock, num)).start()
    112 
    113 '''
    114 '''
    115 
    116 from multiprocessing import Process, Lock
    117  
    118 def f(l, i): #锁,值
    119     l.acquire()
    120     try:
    121         print('hello world', i)
    122     finally:
    123         l.release()
    124  
    125 if __name__ == '__main__':
    126     lock = Lock()
    127  
    128     for num in range(10):
    129         Process(target=f, args=(lock, num)).start()
    130 
    131 '''
    132 
    133 #进程池的使用 (信号量)
    134 
    135 #进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,
    136 #   如果进程池序列中没有可供使用的进进程,那么程序就会等待,
    137 #   直到进程池中有可用进程为止。
    138 #   进程池中有两个方法:
    139 #apply         #串行
    140 #apply_async   #并行
    141 
    142 '''
    143 
    144 from  multiprocessing import Process,Pool
    145 import time
    146  
    147 def Foo(i):
    148     time.sleep(2)
    149     return i+100
    150  
    151 def Bar(arg):
    152     print('-->exec done:',arg)
    153  
    154 pool = Pool(5)
    155  
    156 for i in range(10):
    157     pool.apply_async(func=Foo, args=(i,),callback=Bar)
    158     #pool.apply(func=Foo, args=(i,))
    159  
    160 print('end')
    161 pool.close()
    162 pool.join()#进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。
    163 
    164 '''
    165 
    166 from  multiprocessing import Process,Pool,freeze_support
    167 import time
    168 import os
    169  
    170 def Foo(i):
    171     time.sleep(2)
    172     print('in process',os.getpid())
    173     return i + 100
    174  
    175 def Bar(arg):
    176     print('-->exec done:',arg,os.getpid())
    177     
    178 if __name__ =='__main__':
    179     #freeze_support()
    180     pool = Pool(processes=3) #允许进程池同时放入5个进程
    181     print ('主进程',os.getpid())
    182     for i in range(10):
    183         pool.apply_async(func=Foo, args=(i,),callback=Bar)#callback回调
    184         #pool.apply(func=Foo, args=(i,))#串行
    185         #pool.apply_async(func=Foo, args=(i,))#并行
    186      
    187 print('end')
    188 pool.close()#一定要先关闭进程池再join()
    189 pool.join()#进程池中进程执行完毕后再关闭,如果注释pool.join(),那么程序直接关闭。
    #进程间数据交互#进程同步#进程池的使用 (信号量)
  • 相关阅读:
    maven学习讲解
    《Struts2.x权威指南》学习笔记2
    《Struts2.x权威指南》学习笔记1
    【转】Maven3把命令行创建的web工程转成Eclipse和IntelliJ Idea的工程
    [转]h5页面测试总结
    《零成本实现Web性能测试:基于Apache JMeter》读书笔记
    《软件性能测试过程详解与案例剖析》读书笔记
    手机屏幕尺寸测试——手机的实际显示页面的宽度
    web常识
    vue 生命周期
  • 原文地址:https://www.cnblogs.com/ujq3/p/7349001.html
Copyright © 2011-2022 走看看