首页 > 系统相关 >多进程、多线程知识再整理

多进程、多线程知识再整理

时间:2024-03-10 18:00:32浏览次数:27  
标签:threading 知识 print test 线程 time 进程 多线程 pool

#threading 模块
'''
cpython全局解释器锁导致同时只能有一个线程执行python,利用多cpu执行cpu密集型任务使用多进程,密集io型可以使用多线程并发
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None
Thread 类代表一个在独立控制线程中运行的活动,当线程对象一旦被创建,其活动必须通过调用线程的 start() 方法开始。 这会在独立的控制线程中发起调用 run() 方法。
一旦线程活动开始,该线程会被认为是 '存活的' 。当它的 run() 方法终结了(不管是正常的还是抛出未被处理的异常),就不是'存活的'。 is_alive() 方法用于检查线程是否存活。
其他线程可以调用一个线程的 join() 方法。这会阻塞调用该方法的线程,直到被调用 join() 方法的线程终结。
线程锁Lock  线程递归锁Rlock  
'''
from threading import Thread, Lock
import threading, time
# L1 = Lock() 锁放在全局所有线程共用这把锁
def test(var1, var2='var2'):
    L1 = Lock() # 锁放在任务方法里面实际是创建了多把锁,线程之间的锁互不影响
    L1.acquire()
    print('this is a threading fun test var1 is %s, var2 is %s ' % (var1, var2), end='\n')
    time.sleep(10)
    L1.release()
    print(threading.current_thread(), end='\n')
    print(threading.get_native_id(), end='\n')
    print(threading.main_thread(), end='\n')

t1 = Thread(target=test, args=('t1_var1',), kwargs={'var2': 't1_var2'})
t2 = Thread(target=test, args=('t2_var2',), kwargs={'var2': 't2_var2'})
print('start_time is %s' % time.time())
t1.start()
print('this is t1.is_alive value %s' % t1.is_alive(), end='\n')
print('this is t1.is_alive value %s' % t1.is_alive(), end='\n')
t2.start()
t2.join()
print('end_time is %s' % time.time())


#multiprocessing
'''
在 multiprocessing 中,通过创建一个 Process 对象然后调用它的 start() 方法来生成进程。 Process 和 threading.Thread API 相同
'''
from multiprocessing import Process, Pool, TimeoutError
import time, os
def multiprocess_test(x):
    print('this is subprocess %s start_time %s' % ('Process.pid', time.time()))
    print('main process id :', os.getppid())
    print('sub process id:', os.getpid())
    print('x square is ', x**2)
    time.sleep(2)
    print('this is subprocess %s end_time %s' % ('Process.pid', time.time()))
    return x**2
#https://blog.csdn.net/qq_43580193/article/details/105924104 win多线程调试特殊的地方

def mutithreading_square(y):
    print('threading info',threading.get_native_id(), 'start_time', time.time() )
    time.sleep(5)
    print('%d square is %d' % (y, y**2))
    print('threading info', threading.get_native_id(), 'end_time', time.time())


def muti_pro_threading_test(y):
    with ThreadPoolExecutor(max_workers=5) as executor_Th:
        print('this is subprocess %s start_time %s' % (os.getpid(), time.time()))
        executor_Th.map(mutithreading_square, range(11, 15))
# 启动并行任务
'''
submit(fn, /, *args, **kwargs)调度可调用对象 fn,以 fn(*args, **kwargs) 方式执行并返回一个代表该可调用对象的执行的
map(fn, *iterables, timeout=None, chunksize=1)
类似于 map(fn, *iterables) 但有以下差异:iterables 是立即执行而不是延迟执行的;fn 是异步执行的并且可以并发对 fn 的多个调用。
'''
from concurrent.futures import Executor, ThreadPoolExecutor, ProcessPoolExecutor
# subprocess是使用子进程调用系统命令的推荐

if __name__ == '__main__':
    # 多进程process方法
    # p1 = Process(target=multiprocess_test, args=())
    # p2 = Process(target=multiprocess_test, args=())
    # p1.start()
    # p2.start()
    # 多进程pool方法,自己成在win上debug时多进程启动会有大约0.01s的耗时,返回值时所有进程返回值组成的列表
    # with Pool(processes=3) as pool:
        # pool.map调用方式
        # pool_res = pool.map(multiprocess_test, range(10))
        # print('this is pool_res', pool_res, 'this is running time', time.time())
        # for循环调用方式,i是每个进程调用函数的返回值
        # for i in pool.imap_unordered(multiprocess_test, range(10)):
        #     print('this is i', i)
        # apply_async调用方法,异步运行一个进程,没有参数map到fun的功能
        # pool_res1 = pool.apply_async(multiprocess_test, (20,))
        # print('pool_res1', pool_res1.get(), 'this is running time', time.time())
        # apply_async调用方法,异步运行多个进程方法
        # pool_reses = [pool.apply_async(multiprocess_test, (x,)) for x in range(10)]
        # print([res.get() for res in pool_reses])
    # concurrent.futures 启动并行任务,启动多线程 启动多进程
    # with ThreadPoolExecutor(max_workers=5) as executor_Th:
    #     executor_Th.map(multiprocess_test, range(10))
    # with ProcessPoolExecutor(max_workers=5) as executor_Pro:
    #     executor_Pro.map(multiprocess_test, range(10))
    # 多进程多线程调用测试
    with ProcessPoolExecutor(max_workers=5) as executor_Pro:
        executor_Pro.map(muti_pro_threading_test, range(5))

 

标签:threading,知识,print,test,线程,time,进程,多线程,pool
From: https://www.cnblogs.com/flags-blog/p/18064509

相关文章

  • 【性能测试】性能测试各知识第1篇:性能测试大纲【附代码文档】
    性能测试完整教程(附代码资料)主要内容讲述:性能测试大纲。。。。。。。。。。。。。。全套笔记资料代码移步:前往gitee仓库查看感兴趣的小伙伴可以自取哦,欢迎大家点赞转发~性能测试大纲序号阶段概述01入门1.认识性能测试分类-(负载测试、压力测试、并发测试、......
  • 手撕Java多线程(四)线程之间的协作
    线程之间的协作当多个线程可以一起去解决某个问题时,如果某些部分必须在其他部分之前完成,那么就需要对线程进行协调。join()在线程中调用另一个线程的join()方法,会将当前线程挂起,而不是忙等待,直到目标线程结束。对于以下代码,虽然b线程先启动,但是因为在b线程中调用了a线程的join......
  • IDEA使用与多线程
    IDEA缩写和快捷键psvm全称publicstaticvoidmainsout全称publicstaticvoidmainalt+enter处理异常s.out自动打印sctrl+art+t给整段代码加框如try-catch一、概念进程、程序和进程程序(program)是为完成任务、用某种语言编写的一组指令的集合。即指一段静态的代码,......
  • 在Linux中,如何查看占用CPU最多的进程?
    在Linux中,有多种方法可以查看占用CPU最多的进程。以下是几种常用的方法:使用top命令:top命令是Linux中常用的性能分析工具,可以实时显示系统中各个进程的资源占用情况,包括CPU使用率。打开终端,输入top命令,按下回车键。top命令会显示出当前系统中CPU使用率最高的进程列表。默认情......
  • 计算机网络知识点
    两种交换方式分组(packet)交换不长期占用链路,将报文分组,所有分组由路由器按照目的地址丢到网络中,也就是用户不需要发送/接收分组时就不占用网络资源。电路(circuit)交换通信双方建立一条专用链路,不进行分组交换时这条链路也不能给别人用。路由器与交换机路由器(圆)工作在网络层(......
  • 【Python使用】python高级进阶知识md总结第2篇:HTTP 请求报文,HTTP响应报文【附代码文
    python高级进阶全知识知识笔记总结完整教程(附代码资料)主要内容讲述:操作系统,虚拟机软件,Ubuntu操作系统,Linux内核及发行版,查看目录命令,切换目录命令,绝对路径和相对路径,创建、删除文件及目录命令,复制、移动文件及目录命令,终端命令格式的组成,查看命令帮助。HTTP请求报文,HTTP响应报文......
  • mysql基础知识整理
    事务1.1事务的四大特性原子性(Atomicity):事务包含的所有操作要么全部成功,要么全部失败回滚一致性(Consistency):一个事务执行之前和执行之后都必须处于一致性状态隔离性(Isolation):跟隔离级别相关,如readcommitted,一个事务只能读到已经提交的修改持久性(Durability):一个事务一旦被......
  • 基础GamePlay知识-扇形检测
    将会持续更新gameplay的一些基础知识,一同学习。扇形检测扇形检测是Gameplay里面很常见的场景。比如荒野乱斗中,大部分的近战角色都是扇形攻击。在扇形范围内就认为是受击。扇形检测只有两个参数,一个是扇形的角度一个是扇形的半径大小。效果获取鼠标朝向技能必然是和鼠标朝......
  • Java多线程
    1.java线程实现/创建的方式(主要是两种)继承Thread类本质是通过实现Runnable接口的一个实例,代表一个线程的实例publicclassMyThreadextendsThread{publicvoidrun(){System.out.println("run()")}}MyThreadthread=newMyThread();thread.st......
  • 【Python使用】python高级进阶知识md总结第1篇:My Awesome Book【附代码文档】
    python高级进阶全知识知识笔记总结完整教程(附代码资料)主要内容讲述:MyAwesomeBook,MyAwesomeBook。MyAwesomeBook,MySQL数据库。MyAwesomeBook,聚合函数。MyAwesomeBook,创建表并给某个字段添加数据。MyAwesomeBook,闭包。MyAwesomeBook,路由列表功能开发。MyAwesomeBoo......