1、介绍

软件应用中使用最广泛的并行编程范例是多线程。通常一个应用有一个进程,分成多个独立的线程,并行运行、互相配合,执行不同类型的任务。

线程是独立的处理流程,可以和系统的其他线程并行或并发地执行。多线程可以利用共享内存空间共享数据和资源。线程和进程的具体实现取决于你要运行的操作系统,但是总体来讲,我们可以说线程是包含在进程中的,同一个进程的多个不同的线程可以共享相同的资源,而进程之间不会共享资源。

每一个线程基本上包含3个元素:程序计数器,寄存器和栈。与同一进程的其他线程共享的资源基本上包括数据和系统资源。每一个线程也有自己的运行状态,可以和其他线程同步,线程的状态大体上可以分为ready,running,blocked。线程的典型应用是应用软件的并行化,目的是为了充分利用现代的多核处理器,使每个核心可以运行单个线程。相比于进程,使用线程的优势主要是性能,相比之下,在进程之间切换上下文要比在统一进程的多线程之间切换上下文要重的多。

2、定义一个线程

使用线程最简单的方式是用一个目标函数实例化一个Thread然后调用start()方法启动它。Python的threading模块提供了Thread()方法在不同的线程中运行函数或处理过程等。

class threading.Thread(group=None,  target=None, name=None, args=(), kwargs={})

- group:特性预留

- target:当线程启动的时候要执行的函数

- name:线程的名字,默认为Thread-N

- args:传递给target的参数,要试用tuple类型

- kwargs:同上,试用字段类型dict

线程代码用例:

importthreadingdeffunction(i):print("I am thread-%s" %i)returnthreads=[]for i in range(5):

t= threading.Thread(target=function, args=(i,))

threads.append(t)

t.start()

t.join()

t.join:主线程会调用t线程,然后等待t线程完成再执行for循环开启下一个t线程。可理解为阻塞主线程。

3、确认一个线程

使用参数来确认或命名线程是没有必要的,每一个Thread实例创建的时候都有一个带默认值的名字,并且可以修改。在服务端通常一个服务进程都有多个线程服务,负责不同的操作,这时候命名线程是很实用的。

自定义线程名称用例:

importthreadingimporttimedeffirst_function():print("%s is starting" %threading.currentThread().getName())

time.sleep(2)print("%s is exiting" %threading.currentThread().getName())defsecond_function():print("%s is starting" %threading.currentThread().getName())

time.sleep(2)print("%s is exiting" %threading.currentThread().getName())defthird_function():print("%s is starting" %threading.currentThread().getName())

time.sleep(2)print("%s is exiting" %threading.currentThread().getName())if __name__ == "__main__":

t1= threading.Thread(name='first_function', target=first_function)

t2= threading.Thread(name='second_function', target=second_function)

t3= threading.Thread(name='third_function', target=third_function)

t1.start()

t2.start()

t3.start()

t1.join()

t2.join()

t3.join()

运行结果:

如果不自定义名称如下:

importthreadingimporttimedeffirst_function():print("%s is starting" %threading.currentThread().getName())

time.sleep(2)print("%s is exiting" %threading.currentThread().getName())defsecond_function():print("%s is starting" %threading.currentThread().getName())

time.sleep(2)print("%s is exiting" %threading.currentThread().getName())defthird_function():print("%s is starting" %threading.currentThread().getName())

time.sleep(2)print("%s is exiting" %threading.currentThread().getName())if __name__ == "__main__":#t1 = threading.Thread(name='first_function', target=first_function)

#t2 = threading.Thread(name='second_function', target=second_function)

#t3 = threading.Thread(name='third_function', target=third_function)

t1= threading.Thread(target=first_function)

t2= threading.Thread(target=second_function)

t3= threading.Thread(name='third_function', target=third_function)

t1.start()

t2.start()

t3.start()

t1.join()

t2.join()

t3.join()

运行结果:

4、使用线程

在子类中实现线程:

importthreadingimporttime

exit_flag=0classmyThread(threading.Thread):def __init__(self, threadID, name, counter):

threading.Thread.__init__(self)

self.threadID=threadID

self.name=name

self.counter=counterdefrun(self):print("Starting %s" %self.name)

print_time(self.name, self.counter,5)print("Exiting %s" %self.name)defprint_time(threadName, delay, counter):whilecounter:ifexit_flag:import_thread

_thread.exit()

time.sleep(delay)print("%s:%s" %(threadName, time.ctime(time.time())))

counter-= 1

#创建实例

thread1 = myThread(1, "Thread-1", 1)

thread2= myThread(2, "Thread-2", 2)

thread1.start()

thread2.start()

thread1.join()

thread2.join()print("Exiting Main Thread")

运行结果如下:

线程模块是创建和管理线程的首选形式。每一个线程都通过一个集成Thread的子类代表,覆盖run()方法来实现逻辑,这个方法是线程的入门,执行start()即调用此方法。

python多线程并行编程_Python并行编程(二):基于线程的并行相关推荐

  1. python 多线程 数据库死锁_python并发编程之多线程2死锁与递归锁,信号量等

    一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 这些永远在互相等待的进程称为死锁进程 如下就是死锁 ...

  2. python多线程数据交互_python 多线程 通信

    一篇文章搞定Python多进程(全) 公众号:pythonislover 前面写了三篇关于python多线程的文章,大概概况了多线程使用中的方法,文章链接如下: 一篇文章搞懂Python多线程简单实现 ...

  3. python多线程有用吗_Python多线程理解

    前言 在写python爬虫的时候遇到了多线程,使用多线程的目的是降低抓取时间.接着我接触了一些IO概念,IO就是Input和Ouput,数据进出CPU的意思. 数据从网线或网卡进入CPU算Input( ...

  4. python多线程并行编程,Python并行编程(二):基于线程的并行

    1.介绍 软件应用中使用最广泛的并行编程范例是多线程.通常一个应用有一个进程,分成多个独立的线程,并行运行.互相配合,执行不同类型的任务. 线程是独立的处理流程,可以和系统的其他线程并行或并发地执行. ...

  5. python多进程编程_python并发编程中的多进程(代码实现)

    一.multipricessing模块的介绍 python中的多线程无法利用多核优势,如果想要充分的使用多核CPU资源,在python中大部分情况下需要用多线程,python提供了multiproce ...

  6. python高并发编程_Python——并发编程

    开始说并发编程之前,最好有一定的底层知识积累,这里我把需要的知识总结了一下,如果看下面的有不理解的可以看一下:https://www.cnblogs.com/kuxingseng95/p/941820 ...

  7. unet网络python代码详解_python网络编程详解

    最近在看<UNIX网络编程 卷1>和<FREEBSD操作系统设计与实现>这两本书,我重点关注了TCP协议相关的内容,结合自己后台开发的经验,写下这篇文章,一方面是为了帮助有需要 ...

  8. java io 并发编程,JAVA进阶系列 - 并发编程 - 第1篇:进程线程并发并行

    学习目标进程 线程 并发 并行 内容 一.进程与线程 "专业"点的说法就是:进程是资源分配的最小单位,线程是CPU调度的最小单位. 大哥,我错了,别打脸! 进程 线程就是用来加载指 ...

  9. python socket编程_Python Socket编程实现网络编程

    对于有经验的开发人员来说,掌握的编程语言应该是不少的.在这些编程语言中,网络编程的应用时必不可少的.其中Python也是这样的编程语言.我们今天将会在这里为大家详细介绍一下Python Socket编 ...

最新文章

  1. mysql 数据库 xtrabackup (完全备份恢复,恢复后重启失败总结)
  2. mfc中嵌入python_Python 中的 Hook 钩子函数
  3. python查看数据大小_科多大数据带你看Python可以列为最值得学习的编程语言
  4. JQuery DataTables改变行或列的背景或字体颜色
  5. 外卖和快递行业数据_外卖和快递骑手管理“上轨道”
  6. (转)如何检查系统是否支持Zend Optimizer
  7. php实现中间件6,THINKPHP6 实现中间件
  8. centos安装docker详细步骤,如何配置阿里云镜像加速
  9. Android 代码混淆、第三方平台加固加密、渠道分发 完整教程(转)
  10. arduino与风向传感器的接线_Arduino动手做(8)湿度传感器模块
  11. 新手坐高铁怎么找车厢_新手坐高铁怎么找车厢
  12. @自我怀疑的开发者:你够优秀吗?
  13. (五)谷歌地图坐标转换:经纬度如何实现转换成谷歌地图平面坐标
  14. Java 自定义Excel数据排序
  15. 操作系统文件保护及文件共享
  16. 通过SVG进行画出雷达扫描图
  17. 怀孕期间准妈妈多吃西红柿
  18. jQuery插件autoComplete介绍(10级学员 张帅鹏总结)
  19. EMC AUTOSTART双机热备
  20. 新致新知 | 开启图谱赋能认知新篇章

热门文章

  1. JavaScript id_好程序员web前端分享Javascript中函数作为对象
  2. c语言单词字母翻转,C语言来实现字符串反转(只有单词反转,单词里的字母不反转)...
  3. Dockerfile----ubuntu-java
  4. 从零开始学习docker(零)简单介绍Dockerfile
  5. mysql开启远程访问
  6. 为了上班摸鱼,我用Python开发“BOSS来了”!
  7. 这里有 8 个流行的 Python 可视化工具包,你喜欢哪个?
  8. ug二次开发菜单中文乱码_平面用cad,三维用Ug,不服来怼!
  9. c语言中tgx是什么函数,《高等数学》课后练习题
  10. 从零开始数据科学与机器学习算法-集成算法-10