多进程、多线程

1.multiprocessing是Python中多进程的模块,使用它能实现多线程代码编写

2.启动子线程并结束子线程

先定义一个创建线程的方法,再在主方法中调用Process()函数创建子线程

以及父线程,再调用start()方法以及join()函数实现进程的启动

复制代码
def run_proc(name):
  print('Run child process %s(%s)' %(name,os.getpid()))
if __name__ =='__main__':
  print('Parent process %s.' %os.getpid())
  p = Process(target = run_proc,args = ('test',))
  print('Child process will start.')
  p.start()
  p.join()
  print('Child process end.')
复制代码

3.创建线程池,先创建定义子线程的方法,再在主方法中通过Pool函数配合自己电脑的CPU处理器个数,

再利用Pool函数的实例apply.async方法创建线程池

复制代码
from multiprocessing import Pool
import os,time,random #random为随机函数
#该方法用于子线程内容的实现
def long_time_task(name):
  print('Run task %s(%s)...'% (name,os.getpid()))
  start = time.time()
  time.sleep(random.random()*3)
  end = time.time()
#显示开始和结束时间
  print('Task %s runs %0.2f seconds' %(name,(start-end)))

if __name__ == '__main__':
  print('Parent process %s.' %os.getpid())
  p = Pool(8)  #表示线程量
  for i in range(9):
#这个函数类似于创建线程池
    p.apply_async(long_time_task,args=(i,))
  print('Waiting for all subprocesses done...')
  p.close()
  p.join()
  print('ALL subprocesses done.')
复制代码

4.线程间的通信通过Queue、Pipes方法来实现

先创建写方法,像里面传入数据,通过put方法传入,再定义读方法,从Queue中读取数据通过get方法

再通过Process方法创建两个读写变量,调用start方法和join方法最后调用terminate方法终止死循环

复制代码
from multiprocessing import Process,Queue
import os,time,random
#写数据进程执行的代码:
def write(q):
  print('Process to write :%s'% os.getpid())
  for value in ['A','B','C']:
    print('put %s to queue' %value)
    q.put(value)
    time.sleep(random.random())
#读数据执行的代码
def read(q):
  print('Process to read:%s' % os.getpid())
  while True:
    value = q.get(True)
    print('Get %s from queue.'% value)
if __name__ == '__main__':
  #父进程创建Queue,并传给各个子进程
  q = Queue()
  pw = Process(target = write,args = (q,))
  pr = Process(target = read,args = (q,))
  #启动子进程pw,写入:
  pw.start()
  #启动子线程,读取:
  pr.start()
  #等待pw结束:
  pw.join()
#pr进程是死循环,无法等待其结束,只能强行终止:
pr.terminate()
复制代码

5.启动线程就是把一个函数传入并创建一个实例,我们通过threading模块中的threading.Thread方法来创建线程实例

threading。current_thread().name方法获得当前线程

复制代码
def loop():#定义方法来创建一个线程通过循环获得信息
  print('thread %s is running...'% threading.current_thread().name)
  n = 0
  while n<5
    n = n+1
    print('thread %s >>>%s'%(threading.current_thread.name,n))
    time.sleep(1)#通过time.sleep()函数休眠一会儿输出
  print('threading %s ended.' %threading.current_thread().name)
print('thread %s is running...'% threading.current_thread().name)
# 通过threading Thread()函数传入创建线程方法名以及线程名创建实例线程
t = threading.Thread(target = loop,name = 'LoopThread')
t.start()
t.join()
print('thread %s ended.'%threading.current_thread().name)
复制代码

6.由于线程之间的运行是交替的,所以需要通过Lock来规范线程的运行

先要声明一个锁变量,再获取锁,最后通过try-finally语句释放锁,再调用锁实例来启动线程和关闭线程

7.多核CPU

在Python中任意线程在执行前,都会先获得一个GIL锁,没执行100行代码,就会释放资源,让其他的线程执行

 

posted @   求知律己  阅读(43)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示