创建多线程Thread
创建一个线程:
# 方式一
from threading import Thread
import time def func(n):
time.sleep(1)
print(n) t = Thread(target=func, args=(1,))
t.start()
# 方式二
from threading import Thread
import time class MyThread(Thread):
def __init__(self,n):
super().__init__()
self.n = n def run(self):
time.sleep(1)
print(self.n) t = MyThread(1)
t.start()
创建多线程:
from threading import Thread
import time class MyThread(Thread):
def __init__(self,n):
super().__init__()
self.n = n def run(self):
time.sleep(1)
print(self.n) for i in range(10):
t = MyThread(i)
t.start()
from threading import Thread
import time def func(n):
time.sleep(1)
print(n) for i in range(10):
t = Thread(target=func, args=(i,))
t.start()
一个进程中的线程数据是共享的:
from threading import Thread
import os def func(args):
global n
n = 0
print(n, os.getpid()) n = 100
t_list = []
for i in range(10):
t = Thread(target=func, args=(i,))
t.start()
t_list.append(t)
for t in t_list:
t.join()
print(n)
另一种情况:
from threading import Thread
import os,time def func(args): global n
n = args
time.sleep(0.1)
print(n, os.getpid()) n = 100
t_list = []
for i in range(10):
t = Thread(target=func, args=(i,))
t.start()
t_list.append(t)
for t in t_list:
t.join()
print(n)
看到结果都变成一样的了,因为每个线程都将n的值变一次,不管变几次,n最终只有一个值,所在在0.1秒之后在输出n,都输出n的值了,就变成一样的了。
这种情况就会导致数据不安全,因为我不想要同一个输出结果,我想每个线程更改数据都要输出结果,加锁就可以了。
如下:
from threading import Thread, Lock
import os,time def func(args, lock):
lock.acquire()
global n
n = args
time.sleep(0.1)
print(n, os.getpid())
lock.release() lock = Lock()
n = 100
t_list = []
for i in range(1000):
t = Thread(target=func, args=(i, lock))
t2 = Thread(target=func, args=(i, lock))
t.start()
t2.start()
t_list.append(t)
t_list.append(t2)
for t in t_list:
t.join()
print(n)
这样每个线程的结果都不一样了。
多线程的效率问题:
from threading import Thread
import time
from multiprocessing import Process def func(n):
n += 1 if __name__ == "__main__":
t1 = time.time()
t_list = []
for i in range(50):
t = Thread(target=func, args=(i,))
t.start()
t_list.append(t)
for t in t_list:
t.join()
t2 = time.time() - t1 t3 = time.time()
p_list = []
for i in range(50):
p = Process(target=func, args=(i,))
p.start()
p_list.append(p)
for p in p_list:
p.join()
t4 = time.time() - t3 print(t2, t4)
打印结果:
0.007979869842529297 3.0359175205230713
起50个线程的时间远比起50个进程的时间短。
创建多线程Thread的更多相关文章
- 创建多线程的方式:继承Thread类和实现Runnable接口
1.通过继承Thread类的方式创建多线程(这里只是简单的代码演示创建多线程的方法) package com.baozi.exer; public class ThreadDemo { public ...
- Java线程创建形式 Thread构造详解 多线程中篇(五)
Thread作为线程的抽象,Thread的实例用于描述线程,对线程的操纵,就是对Thread实例对象的管理与控制. 创建一个线程这个问题,也就转换为如何构造一个正确的Thread对象. 构造方法列表 ...
- 创建多线程的第一种方式——创建Thread子类和重写run方法
创建多线程的第一种方式——创建Thread子类和重写run方法: 第二种方式——实现Runnable接口,实现类传参给父类Thread类构造方法创建线程: 第一种方式创建Thread子类和重写run方 ...
- “全栈2019”Java多线程第二章:创建多线程之继承Thread类
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- 创建多线程的方式&Thread类的常用方法
创建多线程的第一种方式:继承java.lang.Thread类 注意:1.一个线程只能执行一次start() 2.不能通过Thread实现类对象的 run()去启动一个线程 3.增加加一个线程,需要新 ...
- Thread类的常用方法_sleep和创建多线程程序的第二种方式_实现Runnable接口
sleep方法是在Thread类中的一个静态方法,当一个线程调用了sleep方法,被调用的那个线程就会暂时的让出指定时间的CPU执行权,在这段时间也不会参与CPU的调度,当时间到了之后,就会重新回到就 ...
- 创建多线程程序的第一种方式_创建Thread类的子类
创建多线程程序的第一种方式:创建Thread类的子类java.lang.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类 实现步骤: 1.创建一个Thread类的子类 ...
- 主线程和创建多线程程序的第一种方式_创建Thread类的子类
/** * 主线程:执行主方法的线程(main) * 单线程程序:在java程序中只有一个线程 * 执行从main方法开始,从上倒下依次执行 */ public class Demo01MainThr ...
- JAVA创建多线程
首先:线程与进程的区别是什么呢? 进程:正在运行的一个程序称之为一个进程,进程负责了内存空间的划分,从宏观的角度:windows是在同时执行多个程序 从微观的角度看,CPU是在快速的切换要执行的程序. ...
随机推荐
- Javascript 字符串(一)常见函数使用
一.js字符串示例1 <script type="text/javascript"> var strobject = new String('123abc123abc' ...
- 遭遇ASP.NET的Request is not available in this context
如果ASP.NET程序以IIS集成模式运行,在Global.asax的Application_Start()中,只要访问Context.Request,比如下面的代码 var request = Co ...
- Grafana数据可视化
1.1 Grafana简介 1.1.1 Grafana是什么? 一个类似Kibana的东西,也是对后端的数据进行实时展示,那么Grafana和Kibana有什么区别?在我看来区别不大,不过在大家的日常 ...
- 在三台Centos或Windows中部署三台Zookeeper集群配置
一.安装包 1.下载最新版(3.4.13):https://archive.apache.org/dist/zookeeper/ 下载https://archive.apache.org/dist/ ...
- 生产系统ELK日志采集系统
总结下,生产在运转的日志采集系统!后续的扩展在于elasticsearch节点与logstash节点与kafka+zookeeper,目的提高吞吐量!
- 关于用wkwebview加载沙盒documents下html文件 模拟器可以,真机不行的解决方案
最近也遇到这个问题,把我解决的思路记录一下 1.问题: 用wkwebview加载(loadRequest)沙盒documents下html文件 模拟器可以,真机不行 (前提是html内部含引用外联样式 ...
- Vue2的独立构建与运行时构建的差别
其实这个问题在你使用vue-cli构建项目的时候是不会出现的,因为你在创建项目的构建过程中已经让你勾选了,然后会写入webpack.config.js中. 这就在这,会让你选择Vue的构建方式. 如果 ...
- 在Visual Studio 2013中安装Mysql for EntityFramework
1. 安装Visual Studio 20132. 下载mysql,安装mysql.3. 下载 mysql-for-visualstudio-1.2.7.msi, 下载链接:https://cdn.m ...
- Object C函数指针@selector
其作用相当于函数指针,现在我看到的大多说用法都是在调用某些函数需要传递一个 函数指针 参数时,使用@selector.它会在当前类里面查找selector后面所跟的函数,返回一个SEL类型的值. S ...
- idea 修改单个项目的 默认编码格式