python3线程启动与停止

时间:2022-12-17 19:49:26

转自:

https://blog.csdn.net/weixin_38125866/article/details/76795462

https://www.cnblogs.com/lcchuguo/p/4687348.html

Python GIL(Global Interpreter Lock)

GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。
有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。
像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL归结为Python语言的缺陷。
所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL

python3的线程启动支持两种方式:

一种是以传入函数名开启;

另一种是通过重写run方法开启;

以传入函数名开启:

import time
import threading def demo(n):
while n >= 0:
print("n:", n)
n -= 1
time.sleep(1) if __name__=='__main__': t = threading.Thread(target=demo, args=(10,))
t.start()
t.join()
print("exit")

重写run方法:

import time
import threading class A(threading.Thread):
def __init__(self, args):
threading.Thread.__init__(self)
self.args = args def run(self):
n = self.args
while n > 0:
print("n:", n)
n -= 1
time.sleep(1) if __name__=='__main__': t = A(10)
t.start()
t.join()
print("exit")

创建后台线程:

t = threading.Thread(target=demo, args=(20,), daemon=True)
t.start() ------------------------------------------------------------

创建后台线程:

def f0():
pass def f1(a1,a2):
time.sleep(5)
f0() '''下面代码是直接运行下去的,不会等待函数里面设定的sleep'''
t= threading.Thread(target=f1,args=(111,112))#创建线程
t.setDaemon(True)#设置为后台线程,这里默认是False,设置为True之后则主线程不用等待子线程
t.start()#开启线程
import time
import threading def run(n):
print('[%s]------running----\n' % n)
time.sleep(2)
print('--done--') def thread1():
print('starting thread: %s' % threading.current_thread().getName())
for i in range(5):
t = threading.Thread(target=run, args=[i, ])
t.start()
t.join(1) print("start thread %s" % threading.current_thread().getName())
m = threading.Thread(target=thread1, args=(), name="thread1")
m.setDaemon(True) # thread1,它做为程序主线程的守护线程,当主线程退出时,thread1线程也会退出,由thread1启动的其它子线程会同时退出,不管是否执行完任务
m.start()
m.join(timeout=2)
print("---main thread done----")#主线程退出
Note:Daemon threads are abruptly stopped at shutdown. Their resources (such as open files, database transactions, etc.) may not be released properly.
If you want your threads to stop gracefully, make them non-daemonic and use a suitable signalling mechanism such as an Event.
 ------------------------------
将类中的函数放在线程中执行,且能控制线程的结束
import time
import threading class DownThread:
def __init__(self):
self._running = True def terminate(self):
self._running = False def run(self, n):
while self._running and n > 0:
print('T-minus', n)
n -= 1
time.sleep(1) if __name__=='__main__': c = DownThread()
t = threading.Thread(target=c.run, args=(10,))
t.start()
time.sleep(3)
c.terminate()
t.join()

Python多线程里面的event方法实现线程间通信

Python 通过threading.Event()产生一个event对象。Event默认内置了一个标志,初始值为False,通过set()将其置为True。wait(timeout)则用于堵塞线程直至Flag被set(或者超时,可选的),isSet()用于查询标志位是否为True,

Clear()则用于清除标志位(使之为False)。

当Event对象的内部信号标志为False时。wait方法一直堵塞线程等待到其为真或者超时(若提供,浮点数,单位为秒)才返回,若Event对象内部标志为True则wait()方法马上返回。

def do(event):
print('start')
event.wait()
print('end') if __name__ == "__main__":
event_obj = threading.Event() # 创建一个事件
event_obj.clear() t1 = threading.Thread(target=do, args=(event_obj,))
t1.start() data = input('请输入要:')
if data == 'True':
event_obj.set() # 变绿灯 time.sleep(5)
 

python3线程启动与停止的更多相关文章

  1. python3线程介绍01(如何启动和调用线程)

    #!/usr/bin/env python# -*- coding:utf-8 -*- import osimport time,randomimport threading # 1-进程说明# 进程 ...

  2. Java线程的启动和停止(一)

    如何构造线程 在运行线程之前需要先构造线程对象,线程对象的构造需要指定线程所需要的属性,比如:所属线程组.线程优先级.是否为Daemon线程等信息.下面我们看一下,java.lang.Thread中对 ...

  3. 【Java 语言】Java 多线程 一 ( 线程启动 | 线程中断 )

    一. 线程启动 线程启动 : -- 1. 继承 Thread 运行线程 : 重写 Thread 类的 run 方法, 然后执行该线程; -- 2. 实现 Runnable 接口, 并运行线程; -- ...

  4. 【Canal源码分析】Canal Instance启动和停止

    一.序列图 1.1 启动 1.2 停止 二.源码分析 2.1 启动 这部分代码其实在ServerRunningMonitor的start()方法中.针对不同的destination,启动不同的Cana ...

  5. nginx 的安装、启动、停止与重启

    一.nginx 基本介绍 1.Nginx 是单进程单线程模型,也就是启动的工作进程只有一个线程响应客户端请求,而 apache 可以在一个进程内启动多个线程响应客户端请求.所以 nginx 的内存占用 ...

  6. 深入浅出Tomcat/2 - Tomcat启动和停止

    Tomcat启动和停止 很明显,我们启动或停止Tomcat,一般调用的是bin下的startup.sh或shutdown.sh(以Linux为例,以下涉及到平台,若无特殊说明,一般都指Linux).我 ...

  7. c# 线程启动while(true) 死循环,里边的return导致线程退出情况,查错

    写了一个线程 线程下启动了一个循环 while(true) { 里边有个判断 如果为空不操作, 有余这个线程是后加的,老程序里边因为有个return没关注,导致线程退出而不能不听的监控 } 线程启动一 ...

  8. Mongodb 笔记01 MongoDB 简介、MongoDB基础知识、启动和停止MongoDB

    MongoDB 简介 1. 易于使用:没有固定的模式,根据需要添加和删除字段更加容易 2. 易于扩展:MongoDB的设计采用横向扩展.面向文档的数据模型使它能很容易的再多台服务器之间进行分割.自动处 ...

  9. Tomcat源码分析——启动与停止服务

    前言 熟悉Tomcat的工程师们,肯定都知道Tomcat是如何启动与停止的.对于startup.sh.startup.bat.shutdown.sh.shutdown.bat等脚本或者批处理命令,大家 ...

随机推荐

  1. VS 2013编译64位版本QT 4.8.6及使用cmake为依赖QT生成VS项目时Could NOT find Qt4

    对于一些已经解决的问题,本博客不再讨论.只将本人遇到的问题做简单的说明. 一.VS 2013编译64位版本QT 4.8.6 QT项目官网中,对于QT4,其只提供了windows X86的版本,并且支持 ...

  2. CentOS的SSH,Putty配置说明

    基本资源: CentOS5.5 (32位) , Mysql6.0 ,Putty ,SSH   Step: 1.VMWare中装好CentOS    A. 可能存在ifconfig等命令无法正常识别) ...

  3. (C/C++) Interview in English. - Memory Allocation/Deallocation.

    Q: What is the difference between new/delete and malloc/free? A: Malloc/free do not know about const ...

  4. http错误码大全

    响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行.响应码分五种类型,由它们的第一位数字表示:1.1xx:信息,请求收到,继续处理2.2xx:成功,行为被成功地接受.理解和采纳3 ...

  5. hdoj 2023 求平均成绩

    求平均成绩 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  6. 《University Calculus》-chaper13-多重积分-二重积分的计算

    之前关于二重积分的笔记,介绍了二重积分概念的引入,但是对于它的计算方法(化为累次积分),介绍的较为模糊,它在<概率论基础教程>中一系列的推导中发挥着很重要的作用. 回想先前关于二重积分的几 ...

  7. 你好,C&plus;&plus;(24)好大一个箱子!5&period;1&period;1 函数的声明和定义

    第5章 用函数封装程序功能 在完成功能强大的工资程序V1.0之后,我们信心倍增,开始向C++世界的更深远处探索. 现在,我们可以用各种数据类型定义变量来表达问题中所涉及的各种数据:用操作符连接这些变量 ...

  8. nodejs之防jade

    你们学习nodejs的时候,千万别用jade,我掉到它的坑里,2天没有爬出来后来用vue

  9. linux Apache安装

    原文:linux Apache安装 1.       下载apache,http://httpd.apache.org/download.cgi  通过这个官方网站,我们可以下到最新的版本.现在版本都 ...

  10. kvm 虚拟化的使用

    kvm原理:基于内核空间虚拟化,加载内核模块,来做到虚拟化(简称内核空间).基于qemu连接内核,driver驱动连接kvm的API接口(简称用户空间): hypervisor 管理硬件设备,传统的虚 ...