创建一个线程:

# 方式一
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. SpringMVC知识点

    一.SpringMVC 1.HelloWorld案例 ①步骤: 加jar包 在web.xml文件中配置DispatcherServlet 加入SpringMVC的配置文件 编写处理请求的处理器,并标识 ...

  2. Mac安装Linux的KVM管理工具virt-manager

    安装: brew tap jeffreywildman/homebrew-virt-manager brew install virt-manager virt-viewer 中途会碰到很多问题,可以 ...

  3. [原创]浅谈Web UI自动化测试

    [原创]浅谈Web UI自动化测试 Web UI自动化测试相信大家都不陌生,今天来谈谈这个,我最早接触自动化测试时大约是在2004年,2006年当时在腾讯财付通算是开始正式接触自动化测试,之所以是正式 ...

  4. android应用程序中获取view的位置

    我们重点在获取view的y坐标,你懂的... 依次介绍以下四个方法: 1.getLocationInWindow int[] position = new int[2]; textview.getLo ...

  5. ethtool 解决网卡丢包严重和网卡原理

      1 概述 最近业务上老有问题,查看发现overruns值不断增加,学习了一下相关的知识.发现数值也在不停的增加.发现这些 errors, dropped, overruns 表示的含义还不大一样. ...

  6. C# Barrier 实现

    当您需要一组任务并行地运行一连串的阶段,但是每一个阶段都要等待所有其他任务都完成前一阶段之后才能开始,你一通过Barrier实例来同步这一类协同工作.Barrier初始化后,将等待特定数量的信号到来, ...

  7. Mongo 常用操作

    1.查询 [基本形式]db.col.find().pretty():pretty() 方法以格式化的方式来显示所有文档. [获取记录条数]:db.users.find().count(); [读取指定 ...

  8. Window下使用Charles对手机的Https请求进行抓包

    https://blog.csdn.net/zhaoerduo/article/details/52128607

  9. jQuery on()方法使用

    jQuery on()方法 基本语法: 语法结构一: $(selector).on(event,function) 语法结构二: $(selector).on(events,[selector],[d ...

  10. angular 2 - 003 typescript

    http://www.typescriptlang.org/docs/index.html var book: string = "hellp angular 2"; var nu ...