python 多线程并发_寻找python大神!!!python如何多线程并发?

不是大神。尝试回答一下。

首先解释下什么叫做线程,什么叫做进程,在解释这两个概念前,我们还需要明白什么叫做GIL全局解释器锁。GIL 全局解释器锁: GIL(全局解释器锁,GIL 只有cpython有):在同一个时刻,只能有一个线程在一个cpu上执行字节码,没法像c和Java一样将多个线程映射到多个CPU上执行,但是GIL会根据执行的字节码行数(为了让各个线程能够平均利用CPU时间,python会计算当前已执行的微代码数量,达到一定阈值后就强制释放GIL)和时间片以及遇到IO操作的时候主动释放锁,让其他字节码执行。说白了GIL就是伪多线程,一个线程运行其他线程阻塞,使你的多线程代码不是同时执行,而是交替执行。

python的多线程:由于GIL的原因,一个CPU同一个时刻只能执行一个线程,但是当遇到IO操作或者运行一定的代码量的时候就会释放全局解释器锁,执行另外一个线程。多线程能够有效提升I/O阻塞型程序的效率;与进程相比,占用的系统资源少;线程间能够共享资源,方便进行通信。python的多线程通过threading实现。

python的多进程:进程几乎可以完成线程能够完成的任何事情。与之不同的是,一个进程里面,包含一个主线程,还可以生成很多子线程。如果有需要的话,可以将它们组成多线程。多进程能够.更好地利用多核处理器;.在处理CPU密集型任务时比多线程要好;可以通过多进程来避免全局解释器锁(GIL)的局限;崩溃的进程不会导致整个程序的崩溃。python中的多进程主要通过multiprocessing模块实现。

threading实现多线程

python中提供两个标准库thread和threading用于对线程的支持,python3中已放弃对前者的支持,后者是一种更高层次封装的线程库,接下来均threading为例实现多线程。

1.创建线程

python中有两种方式实现线程:

(1) 实例化一个threading.Thread的对象,并传入一个初始化函数对象(initial function )作为线程执行的入口;

import threading

import time

def tstart(arg):

time.sleep(0.5)

print("%s running...." % arg)

if __name__ == '__main__':

t1 = threading.Thread(target=tstart, args=('This is thread 1',))

t2 = threading.Thread(target=tstart, args=('This is thread 2',))

t1.start()

t2.start()

t1.join()

t2.join()

print("This is main function")

(2) 继承threading.Thread,并重写run函数;

import threading

import time

class CustomThread(threading.Thread):

def __init__(self, thread_name):

# step 1: call base __init__ function

super(CustomThread, self).__init__(name=thread_name)

self._tname = thread_name

def run(self):

# step 2: overide run function

time.sleep(0.5)

print("This is %s running...." % self._tname)

if __name__ == "__main__":

t1 = CustomThread("thread 1")

t2 = CustomThread("thread 2")

t1.start()

t2.start()

t1.join()

t2.join()

print("This is main function")

上面两种方法本质上都是直接或者间接使用threading.Thread类,实例化后,threading.Thread的主要方法有:start():创建线程后通过start启动线程,等待CPU调度,为run函数执行做准备; run():线程开始执行的入口函数,函数体中会调用用户编写的target函数,或者执行被重载的run函数; (start() 方法是启动一个子线程,线程名就是我们定义的name;run() 方法并不启动一个新线程,就是在主线程中调用了一个普通函数而已。通过Thread类的start方法,可以启动该线程,交给python虚拟机进行调度,当该线程获得执行的机会时,就会调用run方法执行线程。) join([timeout]):阻塞挂起调用该函数的线程,直到被调用线程执行完成或超时。通常会在主线程中调用该方法,等待其他线程执行完成。 name、getName()&setName():线程名称相关的操作; ident:整数类型的线程标识符,线程开始执行前(调用start之前)为None; isAlive()、is_alive():start函数执行之后到run函数执行完之前都为True; daemon、isDaemon()&setDaemon():守护线程相关;

2.执行多线程

前面在解释start()和run()方法时,提到了主线程和子线程,主线程:一个进程中至少有一个线程,并作为程序的入口,这个线程就是主线程(从一开始的代码执行到最后的打印出执行时间为主线程) 子线程:一个进程至少有一个主线程,其它线程称为子线程; 在主线程中创建若线程之后,他们之间没有任何协作和同步,除主线程之外每个线程都是从start()开始被执行,直到执行完毕。

上面的例子中可以发现一共有3个线程,1个主线程和2个子线程,如何定义子线程的?其实在代码中就发现了,使用t1 = threading.Thread(target=tstart)即可生成一个子线程,然后使用t1.start()即可启动这个子线程,这样的话t1.jion()是不是就多余呢?其实不然,使用t1.jion()的作用就是:等待子线程执行完毕后再执行主线程,如果不加上t1.jion()的话,子线程任然执行,但是子线程再等待的时候(io操作的时候),释放出资源,这个时候主线程拿到资源运行主线程的任务,然后再等待子线程运行结束,最后退出主程序。

所以t1.jion()放到位置很重要:

t1.start()

t1.join()

t2.start()

t2.join()

如果这样放的话,就是先执行线程1然后等待线程1执行完毕,然后执行线程2等待线程2执行完毕。

t1.start()

t2.start()

t1.join()

t2.join()

这样的话就不一样,会等到线程1与线程2执行完毕后再执行主线程。

还有很多其他的线程相关的知识点,比如线程之间的优先级、通信等等。下面链接中的这位大神总结的非常全面,可以参考:https://blog.csdn.net/lzy98/article/details/88819425

查看我的更多相关回答:溪亭日暮:汇编 | 我的AI 技术回答​zhuanlan.zhihu.comv2-dae49df45d39cff27d4ce9b55ae2ae0c_180x120.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx/Apache发大招

导读网站程序的上传目录通常是不需要PHP执行解释权限,通过限制目录的PHP执行权限可以提网站的安全性,减少被攻击的机率。下面和大家一起分享下如何在Apache和Nginx禁止上传目录里PHP的执行权限。 Apache下禁止指定目录运行PHP脚本在虚拟主机配置文件中增…

dmp文件查看表空间_innoDb文件

一.文件总体概述InnoDb文件主要有以下文件1. 参数文件:启动需要的各种参数作2. 日志文件:记录mysql实例某种条件做出的响应而写入的文件,如错误日志、二进制日志、慢查询日志、查询日志等3. Socket文件:连接需要的文件…

论文笔记之:Deep Attention Recurrent Q-Network

Deep Attention Recurrent Q-Network 5vision groups 摘要:本文将 DQN 引入了 Attention 机制,使得学习更具有方向性和指导性。(前段时间做一个工作打算就这么干,谁想到,这么快就被这几个孩子给实现了,自愧…

linux c程序中内核态与用户态内存存储问题

Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程序运行的环境。用户态即上层应…

线程自动退出_C++基础 多线程笔记(一)

join & detachjoin和detach为最基本的用法,join可以使主线程(main函数)等待子线程(自定义的function_1函数)完成后再退出程序,而detach可以使子线程与主线程毫无关联的独立运行,当主线程执行…

数组拼接时中间怎么加入空格_【题解二维数组】1123:图像相似度

1123:图像相似度时间限制: 1000 ms 内存限制: 65536 KB【题目描述】给出两幅相同大小的黑白图像(用0-1矩阵)表示,求它们的相似度。说明:若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素点。两幅图像的…

(旧)子数涵数·C语言——条件语句

首先,我们讲一下理论知识,在编程中有三种结构,分别是顺序结构、条件结构、循环结构,如果用流程图来表示的话就是: 那么在C语言中,如何灵活运用这三种结构呢?这就需要用到控制语句了。 而条件语句…

识别操作系统

使用p0f进行操作系统探测 p0f是一款被动探测工具,通过分析网络数据包来判断操作系统类型。目前最新版本为3.06b。同时p0f在网络分析方面功能强大,可以用它来分析NAT、负载均衡、应用代理等。 p0f的命令参数很简单,基本说明如下: l…

常用RGB颜色表

转载于:https://www.cnblogs.com/Itwonderful/p/5550800.html

linux ssh yum升级_Linux 运维必备的 13 款实用工具,拿好了

作者丨Erstickthttp://blog.51cto.com/13740508/2114819本文介绍几款 Linux 运维比较实用的工具,希望对 Linux 运维人员有所帮助。1. 查看进程占用带宽情况 - NethogsNethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽。下载:htt…

iOS应用如何支持IPV6

本文转自 http://www.code4app.com/forum.php?modviewthread&tid8427&highlightipv6 果然是苹果打个哈欠,iOS行业内就得起一次风暴呀。自从5月初Apple明文规定所有开发者在6月1号以后提交新版本需要支持IPV6-Only的网络,大家便开始热火朝天的研…

SQL Server -- SQLserver 存储过程执行错误记录到表

SQLserver 存储过程执行错误记录到表 From: http://blog.csdn.net/leshami/article/details/51333650 对于在执行存储过程中碰到的一些错误,如果未及时捕获或者说传递给前端应用程序来,在这样的情形下,故障的排查显得尤为困难。基于此&…

Windows下C语言连接Oracle数据库

为什么80%的码农都做不了架构师?>>> 最近公司有个项目需要用到Oracle数据库,我负责前期的调研。由于项目要用到C和PHP两种语言,所以先收集这两种语言连接Oracle的方法。PHP使用的是Laravel框架,直接使用了Laravel-OCI…

SU suspecfk命令学习

用suplane生成平面,并查看其FK谱, 水平反射界面经FK变换后,波数为0, 正好处于临界,乃奎斯特频率, 有空间假频, Over,不足之处,欢迎批评指正。 转载于:https://www.cnblog…

dblink查询_分库数据如何查询统计

分库后的计算不能直接使用SQL;异构库 SQL 函数不尽相同;JAVA 硬编码实施难度大;即使借助透明网关访问远程数据库,分库性能优化也是头疼问题。一般常规办法:方法1:java硬编码简单的跨库count运算&#xff0c…

【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

类的继承案例解析&#xff0c;python相关知识延伸 作者&#xff1a;白宁超 2016年10月10日22:36:57 摘要&#xff1a;继<快速上手学python>一文之后&#xff0c;笔者又将python官方文档认真学习下。官方给出的pythondoc入门资料包含了基本要点。本文是对文档常用核心要点…

领域驱动设计:软件核心复杂性应对之道_人人都可以领域驱动设计(一)

最近几年&#xff0c;领域驱动设计&#xff08;Domain-Driven Design&#xff0c;DDD&#xff09;这个术语越来越多地出现在软件工程师的视野里。对DDD不熟悉的人可能会觉得它是软件领域里的一个新的概念&#xff0c;但是实际上&#xff0c;Eric Evans在十几年前就已经提出了这…

linux 进程通信 消息队列

详解linux进程间通信-消息队列 前言&#xff1a;前面讨论了信号、管道的进程间通信方式&#xff0c;接下来将讨论消息队列。 一、系统V IPC 三种系统V IPC&#xff1a;消息队列、信号量以及共享内存&#xff08;共享存储器&#xff09;之间有很多相似之处。 每个内核中的 I P …

wx.checkjsapi是写在config里面吗_用Python写一个程序,解密游戏内抽奖的秘密

前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者&#xff1a; 极客挖掘机PS&#xff1a;如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://t.cn/A6Zvjdun分析需求我们先整理下思…

Dev C++安装第三方库boost

Dev_C安装第三方库boost 安装步骤 准备工作下载boost库&#xff0c;下载地址https://sourceforge.net/projects/boost/1. 设置GCC的环境变量PATH 设置环境变量path,在其中加上DEV-C编译器的路径&#xff08;gcc.exe所在路径&#xff09;&#xff0c;如C:\Program Files (x86)…