创建一个线程:

# 方式一
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的更多相关文章

  1. 创建多线程的方式:继承Thread类和实现Runnable接口

    1.通过继承Thread类的方式创建多线程(这里只是简单的代码演示创建多线程的方法) package com.baozi.exer; public class ThreadDemo { public ...

  2. Java线程创建形式 Thread构造详解 多线程中篇(五)

    Thread作为线程的抽象,Thread的实例用于描述线程,对线程的操纵,就是对Thread实例对象的管理与控制. 创建一个线程这个问题,也就转换为如何构造一个正确的Thread对象. 构造方法列表 ...

  3. 创建多线程的第一种方式——创建Thread子类和重写run方法

    创建多线程的第一种方式——创建Thread子类和重写run方法: 第二种方式——实现Runnable接口,实现类传参给父类Thread类构造方法创建线程: 第一种方式创建Thread子类和重写run方 ...

  4. “全栈2019”Java多线程第二章:创建多线程之继承Thread类

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  5. 创建多线程的方式&Thread类的常用方法

    创建多线程的第一种方式:继承java.lang.Thread类 注意:1.一个线程只能执行一次start() 2.不能通过Thread实现类对象的 run()去启动一个线程 3.增加加一个线程,需要新 ...

  6. Thread类的常用方法_sleep和创建多线程程序的第二种方式_实现Runnable接口

    sleep方法是在Thread类中的一个静态方法,当一个线程调用了sleep方法,被调用的那个线程就会暂时的让出指定时间的CPU执行权,在这段时间也不会参与CPU的调度,当时间到了之后,就会重新回到就 ...

  7. 创建多线程程序的第一种方式_创建Thread类的子类

    创建多线程程序的第一种方式:创建Thread类的子类java.lang.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类 实现步骤: 1.创建一个Thread类的子类 ...

  8. 主线程和创建多线程程序的第一种方式_创建Thread类的子类

    /** * 主线程:执行主方法的线程(main) * 单线程程序:在java程序中只有一个线程 * 执行从main方法开始,从上倒下依次执行 */ public class Demo01MainThr ...

  9. JAVA创建多线程

    首先:线程与进程的区别是什么呢? 进程:正在运行的一个程序称之为一个进程,进程负责了内存空间的划分,从宏观的角度:windows是在同时执行多个程序 从微观的角度看,CPU是在快速的切换要执行的程序. ...

随机推荐

  1. nat 共享上网软件

    http://www.nat32.com/ SinforNat WinGate

  2. 使用mkbootfs制作ramdisk根文件系统

    span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }.CodeMirror ...

  3. Java数据结构和算法(五)——队列

    队列.queue,就是现实生活中的排队. 1.简单队列: public class Queqe { private int array[]; private int front; private in ...

  4. OpenCV3 for python3 学习笔记1

    1.读/写图像文件 OpenCV的imread()函数和imwrite()函数能支持各种静态图像文件格式.不同系统支持的文件格式不一样,但都支持BMP格式,通常还应该支持PNG.JPEG和TIFF格式 ...

  5. 经纬度编码方法推荐-plus code简介

    今天罗孚为大家推荐一种经纬度编码的方法--plus code,原名open location code,是Google于2014年发明的,旨在将表示地理位置的经纬度通过算法推导成一个字符串. plus ...

  6. Mongodb系列- java客户端简单使用(CRUD)

    Mongodb提供了很多的客户端: shell,python, java, node.js...等等. 以 java 为例实现简单的增删改查 pom文件: <dependencies> & ...

  7. CentOS 安装Nginx1.14.0

    原文地址:http://www.cnblogs.com/ascd-eg/p/9275441.html 一.安装所需环境   1.gcc 安装         yum install gcc-c++   ...

  8. 使用xshell+xmanager+pycharm搭建pytorch远程调试开发环境

    1. 相关软件版本 xshell: xmanager: pycharm: pycharm破解服务器:https://jetlicense.nss.im/ 2. 将相应的软件安装(pojie好) a&g ...

  9. 从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 ...

  10. Myeclipse安装、配置、测试

    Myeclipse安装.配置.测试(win7_64bit) 目录 1.概述 2.本文用到的工具 3.安装与激活 4.JavaSE开发测试(确保JDK已正确安装) 5.JavaEE开发测试(确保服务器和 ...