创建多线程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是在快速的切换要执行的程序. ...
随机推荐
- nat 共享上网软件
http://www.nat32.com/ SinforNat WinGate
- 使用mkbootfs制作ramdisk根文件系统
span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }.CodeMirror ...
- Java数据结构和算法(五)——队列
队列.queue,就是现实生活中的排队. 1.简单队列: public class Queqe { private int array[]; private int front; private in ...
- OpenCV3 for python3 学习笔记1
1.读/写图像文件 OpenCV的imread()函数和imwrite()函数能支持各种静态图像文件格式.不同系统支持的文件格式不一样,但都支持BMP格式,通常还应该支持PNG.JPEG和TIFF格式 ...
- 经纬度编码方法推荐-plus code简介
今天罗孚为大家推荐一种经纬度编码的方法--plus code,原名open location code,是Google于2014年发明的,旨在将表示地理位置的经纬度通过算法推导成一个字符串. plus ...
- Mongodb系列- java客户端简单使用(CRUD)
Mongodb提供了很多的客户端: shell,python, java, node.js...等等. 以 java 为例实现简单的增删改查 pom文件: <dependencies> & ...
- CentOS 安装Nginx1.14.0
原文地址:http://www.cnblogs.com/ascd-eg/p/9275441.html 一.安装所需环境 1.gcc 安装 yum install gcc-c++ ...
- 使用xshell+xmanager+pycharm搭建pytorch远程调试开发环境
1. 相关软件版本 xshell: xmanager: pycharm: pycharm破解服务器:https://jetlicense.nss.im/ 2. 将相应的软件安装(pojie好) a&g ...
- 从yield 到yield from再到python协程
yield 关键字 def fib(): a, b = 0, 1 while 1: yield b a, b = b, a+b yield 是在:PEP 255 -- Simple Generator ...
- Myeclipse安装、配置、测试
Myeclipse安装.配置.测试(win7_64bit) 目录 1.概述 2.本文用到的工具 3.安装与激活 4.JavaSE开发测试(确保JDK已正确安装) 5.JavaEE开发测试(确保服务器和 ...