热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python多线程编程之进程和线程基础概念

python多线程编程之进程和线程基础概念多线程编程在多线程(multithreaded,MT)出现之前,计算机程序的执行都
python 多线程编程之进程和线程基础概念

多线程编程

在多线程(multithreaded,MT)出现之前,计算机程序的执行都是由单个步骤序列组成的,该序列组合在主机的CPU中按照同步顺序执行。无论是任务本身需要按照步骤顺序执行,还是整个过程实际上包含了多个子任务,都需要按照既定顺序方式执行。那么,如果这些子任务相互独立,没有因果关系呢,我们是不是考虑要让这些独立的任务同时进行呢?这种并行处理方式可以显著地提高整个任务的性能。这就是多线程编程。

由以上我们可以推测一下,多线程编程针对具有如下特点的编程任务是非常理想的:本质上是异步的;需要多个并发任务;每个活动的处理顺序可能是不确定的。这种编程任务可以被组织成或者划分成多个执行流,其中每个执行流都有一个指定要完成的任务。根据应用的不同,这些子任务可能需要计算出中间结果,然后合并成最终的输出结果。

计算密集型的任务可以比较容易的划分为多个子任务,而那种使用单线程处理多个外部输入源的任务就不那么简单了。如果不使用多线程,要实现这种编程任务就需要为串行程序使用一个或多个计时器,并实现一个多路复用方案。一个串行程序需要从每个IO终端通道来检查用户的输入,然而,程序在读取IO终端通道时不能阻塞,因为用户输入的到达时间是不确定的,并且阻塞回复妨碍其他IO通道的处理。串行程序必须使用非阻塞的IO或拥有计时器的阻塞IO。串行程序只有唯一的执行线程,因此他必须兼顾要执行的多个任务,确保其中的某个任务不会占用过多时间,并对用户的响应时间进行合理的分配。要想实现类似的要求,往往会造成非常复杂的控制流,难以理解和维护。

多线程编程,以及类似Queue(一种多线程队列数据结构)的共享数据机构,可以把任务规划为几个执行特定函数的线程:

  • UserRequestThread:负责读取用户端的输入。程序将创建多个线程,每个客户端一个,客户端的请求将会被放入队列中。
  • RequestProcessor:该线程负责从队列中获取请求并处理,为下一步的线程提供输出。
  • ReplyThread:负责向用户输出,将结果传给用户,或者把数据写到本地文件系统或者数据库中

这个设计中,每个线程的逻辑都不复杂,他们都只需要一个要完成的特定作业。你只需要设计每类线程去做一件事情就可以了。

进程:

计算机程序就是存储在磁盘上的可执行的二进制文件。只有当它们被加载到内存中并被操作系统调用,才拥有生命周期。进程(有时又叫重量级进程)则是一个执行中的程序。每个进程都拥有自己的地址空间、内存、数据栈以及其他一些用于追踪执行的数据。操作系统管理者其上所有进程的执行,并尽量为它们分配时间。进程还可以通过派生新的进程来执行其他任务(不同的操作系统上叫法不同,Linux上交fork)。注意的是,每个新进程也都拥有自己的内存和数据栈等,进程之间是通过进程间通信(IPC)的方式实现信息的共享。

线程:

一般提到线程(又叫轻量级进程)的时候,默认的前提是它们都是在同一个进程下执行的,并享有相同的上下文。可以将其认为是在一个主进程或者‘主线程’中并行运行的一些‘迷你线程’

线程一般包括开始、执行顺序和结束三部分。它有一个指令指针,用于记录当前运行的上下文。当其他线程运行时,它可以被抢占(中断)和临时挂起(睡眠)。这种方式叫让步(yielding)。

同一个进程中的各个线程和主线程共享同一片数据空间,所以,相比于进程而言,线程间的通信和信息共享更能容易实现;线程一般是并发执行的。综合这两点,使得多任务间的协作成为可能。注意的是,单核CPU的前提下,真正的并发是不可能,线程一般都是这么执行的:每个线程执行一段时间,然后让步给其他线程;每个线程都有自己的任务,必要的时候,可以和其他线程进行结果通信。

另外,有共享就有风险。由于多个线程可以访问同一片数据,由于数据访问的顺序不同,可能导致结果不一致的现象。这种情况成为竟太条件(race condition)。解决方法是,大部分语言都有一些同步原语,用于线程管理器控制执行和访问。

还有就是,线程无法给与公平的执行时间。因为有些函数在完成前保持阻塞状态,如果没有专门为多线程情况进行修改,会导致CPU的时间分配像这些贪婪的函数倾斜。

总结:

线程是最小的执行单元,而进程至少由一个线程组成。如何调度进程和线程,由操作系统决定。

多进程和多线程编程,涉及到同步、数据共享的问题,需要多花功夫。

 

posted on 2018-03-26 15:27 风雨一肩挑 阅读(...) 评论(...) 编辑 收藏

转:https://www.cnblogs.com/hiwuchong/p/8651360.html



推荐阅读
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • Linux磁盘的分区、格式化的观察和操作步骤
    本文介绍了如何观察Linux磁盘的分区状态,使用lsblk命令列出系统上的所有磁盘列表,并解释了列表中各个字段的含义。同时,还介绍了使用parted命令列出磁盘的分区表类型和分区信息的方法。在进行磁盘分区操作时,根据分区表类型选择使用fdisk或gdisk命令,并提供了具体的分区步骤。通过本文,读者可以了解到Linux磁盘分区和格式化的基本知识和操作步骤。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
author-avatar
zxcvbnm89
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有