首页 > 编程语言 > 详细

多进程、多线程

时间:2021-07-12 22:47:08      阅读:50      评论:0      收藏:0      [点我收藏+]

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行代码,就会释放资源,让其他的线程执行

 

多进程、多线程

原文:https://www.cnblogs.com/kzf-99/p/15004123.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!