python3线程启动与停止
转自:
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 anEvent.
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线程启动与停止的更多相关文章
- python3线程介绍01(如何启动和调用线程)
#!/usr/bin/env python# -*- coding:utf-8 -*- import osimport time,randomimport threading # 1-进程说明# 进程 ...
- Java线程的启动和停止(一)
如何构造线程 在运行线程之前需要先构造线程对象,线程对象的构造需要指定线程所需要的属性,比如:所属线程组.线程优先级.是否为Daemon线程等信息.下面我们看一下,java.lang.Thread中对 ...
- 【Java 语言】Java 多线程 一 ( 线程启动 | 线程中断 )
一. 线程启动 线程启动 : -- 1. 继承 Thread 运行线程 : 重写 Thread 类的 run 方法, 然后执行该线程; -- 2. 实现 Runnable 接口, 并运行线程; -- ...
- 【Canal源码分析】Canal Instance启动和停止
一.序列图 1.1 启动 1.2 停止 二.源码分析 2.1 启动 这部分代码其实在ServerRunningMonitor的start()方法中.针对不同的destination,启动不同的Cana ...
- nginx 的安装、启动、停止与重启
一.nginx 基本介绍 1.Nginx 是单进程单线程模型,也就是启动的工作进程只有一个线程响应客户端请求,而 apache 可以在一个进程内启动多个线程响应客户端请求.所以 nginx 的内存占用 ...
- 深入浅出Tomcat/2 - Tomcat启动和停止
Tomcat启动和停止 很明显,我们启动或停止Tomcat,一般调用的是bin下的startup.sh或shutdown.sh(以Linux为例,以下涉及到平台,若无特殊说明,一般都指Linux).我 ...
- c# 线程启动while(true) 死循环,里边的return导致线程退出情况,查错
写了一个线程 线程下启动了一个循环 while(true) { 里边有个判断 如果为空不操作, 有余这个线程是后加的,老程序里边因为有个return没关注,导致线程退出而不能不听的监控 } 线程启动一 ...
- Mongodb 笔记01 MongoDB 简介、MongoDB基础知识、启动和停止MongoDB
MongoDB 简介 1. 易于使用:没有固定的模式,根据需要添加和删除字段更加容易 2. 易于扩展:MongoDB的设计采用横向扩展.面向文档的数据模型使它能很容易的再多台服务器之间进行分割.自动处 ...
- Tomcat源码分析——启动与停止服务
前言 熟悉Tomcat的工程师们,肯定都知道Tomcat是如何启动与停止的.对于startup.sh.startup.bat.shutdown.sh.shutdown.bat等脚本或者批处理命令,大家 ...
随机推荐
- command not found shell returned 127
在 vim 修改某个文件后,退出时,报了如此一个错误.日志如下: 并不是什么大问题,只是在刚入坑 ssh 时,真的被人代入坑里了. # 强制退出并保存 :wq! 不是 :!wq,不知道有没有有缘的小伙 ...
- 初步接触ES6
Babel---ES6转码器 ES6 声明变量的六种方法 ES5 只有两种声明变量的方法:var命令和function命令. ES6除了添加let和const命令,另外两种声明变量的方法:import ...
- Java的CountDownLatch和CyclicBarrier的理解和区别
CountDownLatch和CyclicBarrier的功能看起来很相似,不易区分,有一种谜之的神秘.本文将通过通俗的例子并结合代码讲解两者的使用方法和区别. CountDownLatch和Cycl ...
- [转]VS中的路径宏 OutDir、ProjectDir、SolutionDir各种路径含义
转自 http://blog.csdn.net/restraint/article/details/39934401 说明 $(RemoteMachine) 设置为“调试”属性页上“远程计算机”属性的 ...
- Scrapy基本命令
全局命令,不用在项目中运行fetch:爬取网页,不依赖爬虫项目直接爬网页信息,并显示爬取过程scrapy命令格式:scrapy 命令名 --参数,可能通过--控制,例如:scrapy fetch -h ...
- 学习笔记38—国外appleID注册教程
国外appleid注册教程来啦….至于国外appleid有什么用处就不过多的介绍了,需要的人自然是知道,不知道的百度下.1.首先打开苹果appleid注册网址:https://appleid.appl ...
- docker-compose在dockerfile更新后自动更新image
比如在dockerfile里需要新安装包 形如 加一行 RUN pip3 install XXX 之后,希望docker-compose能更新镜像, 然后启动容器 只需要启动时使用 --build即可 ...
- jquery将表单序列化json对象
$.fn.serializeObject = function () { var obj = {}; var count = 0; $.each(this.serializeArray(), func ...
- Java代理机制之初见(理解及实现)
都知道Java中的Spring,有一重要思想:AOP,实现原理也就是Java的动态代理机制.初见代理这个名词时,觉得生活中常有代理的这一说法. 那么,在Java中,代理又是什么呢?它又是如何实现的?实 ...
- (转+整理)C#中使用GUID
GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成GUID的API.生成算法很有意思,用到了以太网卡地址.纳秒级时间.芯片ID码和许多可 ...