【神行百里】python开启多线程(threading)与多进程(multiprocessing)运行

这篇具有很好参考价值的文章主要介绍了【神行百里】python开启多线程(threading)与多进程(multiprocessing)运行。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  由于处理数据过多,程序运行很慢,就学习了一下python开启多线程与多进程的方法,虽然最后也没用上,但还是记录总结一下,以备不时之需。

  传送门:进程与线程认识,进程与线程通俗理解
  简言之,进程为资源分配的最小单元,线程为程序执行的最小单元


1. threading库实现多线程运行

  threading库中的Thread类可以方便地开启多线程运行,Thread类需要传入两个参数,target为需要执行的函数,args为函数的参数,本例中自定义的multithreading函数具有三个参数。

import threading
import time
import os

def multithreading(data, clss, k):
    for i in range(5):
        time.sleep(3 * (k + 1))
        print(k, ":", clss, "--->", data,
              "---> 线程id:", threading.get_ident(),
              "---> 进程id:", os.getpid())

data = ["一念月落,一念身错,一念关山难涉过。棋逢过客,执子者不问因果。",
        "奉上,唯愿去踏破善恶之叠浪,一心并肩赴跌宕",
        "刺予我伤口,重生了魂魄,立剑的时候,疾骤的嘶吼"]
clss = ["一念关山", "奉上", "立剑"]

threads = []
for k in range(3):
    t = threading.Thread(target=multithreading, args=(data[k], clss[k], k))  # 创建实例
    threads.append(t)  
    t.start()  # 启动线程运行

for t in threads:
    t.join()   # 等待所有线程执行完成

  输出如下,三句话的线程id不同,但进程id一样。不同的线程抢占cpu资源,导致三句话打印混乱,由于延时差异,“立剑” 线程最后完成。

0 : 一念关山 ---> 一念月落,一念身错,一念关山难涉过。棋逢过客,执子者不问因果。 ---> 线程id: 8956 ---> 进程id: 1268
0 : 一念关山 ---> 一念月落,一念身错,一念关山难涉过。棋逢过客,执子者不问因果。 ---> 线程id: 8956 ---> 进程id: 1268
1 : 奉上 ---> 奉上,唯愿去踏破善恶之叠浪,一心并肩赴跌宕 ---> 线程id: 5640 ---> 进程id: 1268
2 : 立剑 ---> 刺予我伤口,重生了魂魄,立剑的时候,疾骤的嘶吼 ---> 线程id: 26068 ---> 进程id: 1268
0 : 一念关山 ---> 一念月落,一念身错,一念关山难涉过。棋逢过客,执子者不问因果。 ---> 线程id: 8956 ---> 进程id: 1268
1 : 奉上 ---> 奉上,唯愿去踏破善恶之叠浪,一心并肩赴跌宕 ---> 线程id: 5640 ---> 进程id: 1268
0 : 一念关山 ---> 一念月落,一念身错,一念关山难涉过。棋逢过客,执子者不问因果。 ---> 线程id: 8956 ---> 进程id: 1268
0 : 一念关山 ---> 一念月落,一念身错,一念关山难涉过。棋逢过客,执子者不问因果。 ---> 线程id: 8956 ---> 进程id: 1268
2 : 立剑 ---> 刺予我伤口,重生了魂魄,立剑的时候,疾骤的嘶吼 ---> 线程id: 26068 ---> 进程id: 1268
1 : 奉上 ---> 奉上,唯愿去踏破善恶之叠浪,一心并肩赴跌宕 ---> 线程id: 5640 ---> 进程id: 1268
1 : 奉上 ---> 奉上,唯愿去踏破善恶之叠浪,一心并肩赴跌宕 ---> 线程id: 5640 ---> 进程id: 1268
2 : 立剑 ---> 刺予我伤口,重生了魂魄,立剑的时候,疾骤的嘶吼 ---> 线程id: 26068 ---> 进程id: 1268
1 : 奉上 ---> 奉上,唯愿去踏破善恶之叠浪,一心并肩赴跌宕 ---> 线程id: 5640 ---> 进程id: 1268
2 : 立剑 ---> 刺予我伤口,重生了魂魄,立剑的时候,疾骤的嘶吼 ---> 线程id: 26068 ---> 进程id: 1268
2 : 立剑 ---> 刺予我伤口,重生了魂魄,立剑的时候,疾骤的嘶吼 ---> 线程id: 26068 ---> 进程id: 1268

  


2. multiprocessing库实现多进程运行

  multiprocessing库使用方法与threading库相同,其开启类为Process。

  不过多进程运行似乎在windows下运行有点问题,参考 这篇文章 也没解决,似乎是windows下可以执行但无法显示,不过在linux下是可以显示的。

import threading
import multiprocessing
import time
import os

def my_multiprocess(data, clss, k):
    for i in range(5):
        time.sleep(3 * (k + 1))
        print(k, ":", clss, "--->", data,
              "---> 线程id:", threading.get_ident(),
              "---> 进程id:", os.getpid())

data = ["一念月落,一念身错,一念关山难涉过。棋逢过客,执子者不问因果。",
        "奉上,唯愿去踏破善恶之叠浪,一心并肩赴跌宕",
        "刺予我伤口,重生了魂魄,立剑的时候,疾骤的嘶吼"]
clss = ["一念关山", "奉上", "立剑"]

processes = []
for k in range(3):
    p = multiprocessing.Process(target=my_multiprocess, args=(data[k], clss[k], k))
    processes.append(p)
    p.start()

for p in processes:
    p.join()

  linux下运行的输出如下,三句话的进程id不同,但线程id一样了,这是可以的,线程id只要保证在进程中的唯一性就可以啦~

0 : 一念关山 ---> 一念月落,一念身错,一念关山难涉过。棋逢过客,执子者不问因果。 ---> 线程id: 140066568185664 ---> 进程id: 1889018
0 : 一念关山 ---> 一念月落,一念身错,一念关山难涉过。棋逢过客,执子者不问因果。 ---> 线程id: 140066568185664 ---> 进程id: 1889018
1 : 奉上 ---> 奉上,唯愿去踏破善恶之叠浪,一心并肩赴跌宕 ---> 线程id: 140066568185664 ---> 进程id: 1889019
0 : 一念关山 ---> 一念月落,一念身错,一念关山难涉过。棋逢过客,执子者不问因果。 ---> 线程id: 140066568185664 ---> 进程id: 1889018
2 : 立剑 ---> 刺予我伤口,重生了魂魄,立剑的时候,疾骤的嘶吼 ---> 线程id: 140066568185664 ---> 进程id: 1889020
0 : 一念关山 ---> 一念月落,一念身错,一念关山难涉过。棋逢过客,执子者不问因果。 ---> 线程id: 140066568185664 ---> 进程id: 1889018
1 : 奉上 ---> 奉上,唯愿去踏破善恶之叠浪,一心并肩赴跌宕 ---> 线程id: 140066568185664 ---> 进程id: 1889019
0 : 一念关山 ---> 一念月落,一念身错,一念关山难涉过。棋逢过客,执子者不问因果。 ---> 线程id: 140066568185664 ---> 进程id: 1889018
2 : 立剑 ---> 刺予我伤口,重生了魂魄,立剑的时候,疾骤的嘶吼 ---> 线程id: 140066568185664 ---> 进程id: 1889020
1 : 奉上 ---> 奉上,唯愿去踏破善恶之叠浪,一心并肩赴跌宕 ---> 线程id: 140066568185664 ---> 进程id: 1889019
1 : 奉上 ---> 奉上,唯愿去踏破善恶之叠浪,一心并肩赴跌宕 ---> 线程id: 140066568185664 ---> 进程id: 1889019
2 : 立剑 ---> 刺予我伤口,重生了魂魄,立剑的时候,疾骤的嘶吼 ---> 线程id: 140066568185664 ---> 进程id: 1889020
1 : 奉上 ---> 奉上,唯愿去踏破善恶之叠浪,一心并肩赴跌宕 ---> 线程id: 140066568185664 ---> 进程id: 1889019
2 : 立剑 ---> 刺予我伤口,重生了魂魄,立剑的时候,疾骤的嘶吼 ---> 线程id: 140066568185664 ---> 进程id: 1889020
2 : 立剑 ---> 刺予我伤口,重生了魂魄,立剑的时候,疾骤的嘶吼 ---> 线程id: 140066568185664 ---> 进程id: 1889020

  


  so:多线程与多进程运行可以提高Python程序运行速度吗

  Python的全局解释器锁(GIL)限制了同一时刻只有一个线程可以执行Python字节码,对于计算密集型任务,多线程往往无法提高程序的执行速度,但对于IO密集型任务,多线程可以利用IO阻塞等待时的空闲时间执行其他线程,提升运行效率。
  多进程则可以有效地避免GIL的限制,允许同时执行多个进程,从而提高程序的执行速度。文章来源地址https://www.toymoban.com/news/detail-783302.html

到了这里,关于【神行百里】python开启多线程(threading)与多进程(multiprocessing)运行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python多线程Thread——生产者消费者模型 python队列与多线程——生产者消费者模型

    下面面向对象的角度看线程 那么你可以试试看能不能用面向对象的方法实现生产者消费者模型吧。

    2024年02月09日
    浏览(55)
  • 一文掌握Python多线程与多进程

    并发是今天计算机编程中的一项重要能力,尤其是在面对需要大量计算或I/O操作的任务时。Python 提供了多种并发的处理方式,本篇文章将深入探讨其中的两种:多线程与多进程,解析其使用场景、优点、缺点,并结合代码例子深入解读。 Python中的线程是利用 threading 模块实现

    2024年02月09日
    浏览(44)
  • Queue的多线程爬虫和multiprocessing多进程

    Queue的模块里面提供了同步的、线程安全的队列类,包括FIFO(先入后出)队列Queue、FIFO(后入先出)LifoQueue和优先队列PriorityQueue。 (在上个文件创建了爬取文件) 我们使用这个方法来获取,代码如下: 对象传入myThread中; thread = myThread(tName,workQueue)  使用一个for循环来

    2024年04月14日
    浏览(39)
  • 【linux 多线程并发】多线程模型下的信号通信处理,与多进程处理的比较,属于相同进程的线程信号分发机制

    ​ 专栏内容 : 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构,以及如何实现多机的数据库节点的多读多写,与传统主备,MPP的区别,技术难点的分析,数据元数据同步,多主节点的情况下对故障容灾的支持。 手写数据库toadb 本专栏主要介绍如何从零开发,开发的

    2024年01月17日
    浏览(49)
  • Python进程池multiprocessing.Pool

    鲲鹏920:192核心 内存:756G python:3.9 在做单纯的cpu计算的场景,使用单进程核多进程的耗时做如下测试: 单进程情况下cpu的占用了如下,占用一半的核心数: 每一步和总耗时如下: cpu占用如下,每个进程基本占用48个左右核心数; 多进程的耗时如下: 每一个进程的耗时为

    2024年01月17日
    浏览(39)
  • Python中使用multiprocessing模块创建进程

            在计算机编程领域,多进程编程是一种常见的并发编程技术,特别适用于利用多核处理器来提高程序性能和并行处理任务。Python作为一种功能强大的编程语言,提供了多种方法来实现多进程编程。其中,multiprocessing模块为我们提供了一种简单而强大的方式来创建和

    2024年02月22日
    浏览(38)
  • Python自学:使用多进程处理 multiprocessing

    以下代码没有使用多进程。 输出为: Sleeping 1 second… Done Sleep… Sleeping 1 second… Done Sleep… Finished in 2.03 second(s) 以下代码使用了多进程。 输出为: Sleeping 1 second… Sleeping 1 second… Done Sleep… Done Sleep… Finished in 1.07 second(s) 输出为: Sleeping 1.5 second(s)… Sleeping 1.5 second(s)… Slee

    2024年02月09日
    浏览(43)
  • 【Linux】 由“进程”过渡到“线程” -- 什么是线程(thread)?

    如何看待地址空间和页表: 地址空间是进程能看到的资源窗口 页表决定,进程真正拥有资源的情况(页表映射多少才是拥有多少) 合理的对地址空间+页表进行资源划分,我们就可以对一个进程所有的资源进行分类 虚拟地址如何找到物理地址: 最后一级页表存放的是页框的起

    2024年02月15日
    浏览(44)
  • Python分享之多进程探索 (multiprocessing包)

    在初步了解Python多进程之后,我们可以继续探索multiprocessing包中更加高级的工具。这些工具可以让我们更加便利地实现多进程。   进程池 进程池 (Process Pool)可以创建多个进程。这些进程就像是随时待命的士兵,准备执行任务(程序)。一个进程池中可以容纳多个待命的士兵。

    2024年02月08日
    浏览(33)
  • 【Java基础教程】(四十二)多线程篇 · 上:多进程与多线程、并发与并行的关系,多线程的实现方式、线程流转状态、常用操作方法解析~

    理解进程与线程的区别; 掌握Java 中多线程的两种实现方式及区别; 掌握线程的基本操作方法; 进程是程序的一次动态执行过程,它经历了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到最终消亡的过程 。多进程操作系统能同时运行多

    2024年02月16日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包