基于线程的并行-Python 并行编程学习笔记(一)
前言
最近写一些模拟集群智能的算法,虽然机制简单,但是随着个体的增加,设计的计算量就比较大了,尤其是加上matplotlib进行动态展示,使得运算量骤增,看着画面也比较卡.之前想把算法转化成c++代码,利用qt进行展示,入了坑才发现不是一朝一夕之功,没办法,还是回到自己熟悉的python上看看能不能优化一下代码.然后买了<<Python 并行编程-第二版>>这本书从头学起,希望用两三个月把这个整个七七八八.我相信我能坚持下去,把这块骨头啃明白.算是一个学习笔记吧,加上一些自己的理解,如果有哪位看官看到此文,发现讲到不对的地方加以批评指正.
基于线程的并行
threading模块提供的Thread类
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})
主要的参数就三个:
- target:线程要执行的目标函数
- name:线程名
- args:目标函数的参数
下面是一个简单的例子:
import threading
import time
import random
def sleep_out(i):
print("{}号程序开始执行\n".format(i))
num = random.randint(0, 10)
time.sleep(num)
print("{}号程序休息了{}s\n".format(i,num))
if __name__ == "__main__":
threads = []
for i in range(10):
t = threading.Thread(target=sleep_out, args=(i,), name="thread-{}".format(i))
threads.append(t)
for t in threads:
t.start()
for t in threads:
t.join()
-----------------------------------输出-----------------------------
0号程序开始执行
1号程序开始执行
2号程序开始执行
3号程序开始执行
4号程序开始执行
5号程序开始执行
6号程序开始执行
7号程序开始执行
8号程序开始执行
9号程序开始执行
8号程序休息了1s
7号程序休息了4s
6号程序休息了5s
2号程序休息了6s
4号程序休息了7s
0号程序休息了7s
3号程序休息了8s
1号程序休息了10s
9号程序休息了10s
5号程序休息了10s
进程已结束,退出代码0
线程开始执行使用start()
方法,一旦线程开始执行,则运行会转入后台,主线程继续执行.而要等待一个线程结束,必须使用join()
方法,该方法会让主线程进入等待状态,直到线程执行完毕,主线程才会继续执行.
我们将刚才的程序改写为:
import threading
import time
import random
def sleep_out(i):
print("{}号程序开始执行\n".format(i))
num = random.randint(0, 10)
time.sleep(num)
print("{}号程序休息了{}s\n".format(i,num))
if __name__ == "__main__":
threads = []
for i in range(10):
t = threading.Thread(target=sleep_out, args=(i,), name="thread-{}".format(i))
threads.append(t)
t.start()
t.join()
-----------------------------------输出-----------------------------
0号程序开始执行
0号程序休息了6s
1号程序开始执行
1号程序休息了6s
2号程序开始执行
2号程序休息了8s
3号程序开始执行
3号程序休息了0s
4号程序开始执行
4号程序休息了5s
5号程序开始执行
5号程序休息了1s
6号程序开始执行
6号程序休息了8s
7号程序开始执行
7号程序休息了8s
8号程序开始执行
8号程序休息了10s
9号程序开始执行
9号程序休息了9s
进程已结束,退出代码0
start()
方法和join()
方法相辅相成,一般不能独立存在.
确定当前线程
使用currentThread().getName()
方法会返回当前线程名.
继续在刚才的代码上修改:
import threading
import time
import random
def sleep_out(i):
print("{}号程序开始执行\n".format(i))
print("当前线程为"+threading.currentThread().getName())
num = random.randint(0, 10)
time.sleep(num)
print("{}号程序休息了{}s\n".format(i,num))
if __name__ == "__main__":
threads = []
for i in range(10):
t = threading.Thread(target=sleep_out, args=(i,), name="thread-{}".format(i))
threads.append(t)
t.start()
t.join()
-----------------------------------输出-----------------------------
0号程序开始执行
当前线程为thread-0
0号程序休息了2s
1号程序开始执行
当前线程为thread-1
1号程序休息了2s
2号程序开始执行
当前线程为thread-2
2号程序休息了3s
3号程序开始执行
当前线程为thread-3
3号程序休息了1s
4号程序开始执行
当前线程为thread-4
4号程序休息了3s
5号程序开始执行
当前线程为thread-5
5号程序休息了1s
6号程序开始执行
当前线程为thread-6
6号程序休息了2s
7号程序开始执行
当前线程为thread-7
7号程序休息了1s
8号程序开始执行
当前线程为thread-8
8号程序休息了1s
9号程序开始执行
当前线程为thread-9
9号程序休息了4s
进程已结束,退出代码0
自定义线程类
我们可以创建继承Thread
类的子类,再重新定义run()
方法,实现自己需要的功能.
示例如下:
import time
import threading
from random import randint
import os
def sleep_out(num):
time.sleep(num)
class MyThreadClass(threading.Thread):
def __init__(self, name, duration):
threading.Thread.__init__(self)
self.name = name
self.duration = duration
def run(self):
print("线程:" + self.name + "正在运行, 进程ID:" + str(os.getpid()))
sleep_out(self.duration)
print("线程" + self.name + "结束!!!")
if __name__ == "__main__":
start_time = time.time()
threads = []
for i in range(10):
t = MyThreadClass(name="thread-{}".format(i), duration=randint(0, 5))
threads.append(t)
for t in threads:
t.start()
for t in threads:
t.join()
print("-----{}-----".format(time.time() - start_time))
----------输出----------
线程:thread-0正在运行, 进程ID:11804
线程thread-0结束!!!
线程:thread-1正在运行, 进程ID:11804
线程:thread-2正在运行, 进程ID:11804
线程:thread-3正在运行, 进程ID:11804
线程:thread-4正在运行, 进程ID:11804
线程:thread-5正在运行, 进程ID:11804
线程:thread-6正在运行, 进程ID:11804
线程:thread-7正在运行, 进程ID:11804
线程:thread-8正在运行, 进程ID:11804
线程:thread-9正在运行, 进程ID:11804
线程thread-6结束!!!线程thread-8结束!!!
线程thread-5结束!!!
线程thread-7结束!!!
线程thread-9结束!!!
线程thread-2结束!!!线程thread-3结束!!!
线程thread-1结束!!!线程thread-4结束!!!
-----5.019770860671997-----
基于线程的并行-Python 并行编程学习笔记(一)的更多相关文章
- python 函数式编程学习笔记
函数基础 一个函数就是将一些语句集合在一起的部件,它们能够不止一次地在程序中运行.函数的主要作用: 最大化的代码重用和最小化代码冗余 流程的分解 一般地,函数讲的流程是:告诉你怎样去做某事,而不是让你 ...
- Python核心编程--学习笔记--1--Python简介
本章介绍了Python的背景知识,包括什么是Python.Python的起源以及Python的一些关键特性. 1 什么是Python Python是一门优雅而健壮的编程语言,它继承了传统编译语言的强大 ...
- python网络编程学习笔记(三):socket网络服务器(转载)
1.TCP连接的建立方法 客户端在建立一个TCP连接时一般需要两步,而服务器的这个过程需要四步,具体见下面的比较. 步骤 TCP客户端 TCP服务器 第一步 建立socket对象 建立socket对 ...
- Python核心编程--学习笔记--4--Python对象
现在开始学习Python语言的核心部分.首先了解什么是Python对象,然后讨论最常用的内建类型,接下来讨论标准类型运算符和内建函数,之后给出对标准类型的不同分类方式,最后提一提Python目前还不支 ...
- Python核心编程--学习笔记--3--Python基础
本章介绍基本的Python语法.编程风格:并简要介绍标识符.变量和关键字,以及变量占用内存的分配和回收:最后给出一个较大的Python样例程序来体验这些特性. 1 语句和语法 1.1 注释 可以在一行 ...
- python网络编程学习笔记(10):webpy框架
转载请注明:@小五义http://www.cnblogs.com/xiaowuyi django和webpy都是python的web开发框架.Django的主要目的是简便.快速的开发数据库驱动的网站. ...
- python多进程编程学习笔记
摘自[https://www.cnblogs.com/chenhuabin/p/10070996.html] by 奥辰 赞
- Python核心编程--学习笔记--9--文件和输入输出
本章将深入介绍Python的文件处理和相关输入输出能力,包括:文件对象(以及它的内建函数.内建方法和属性),标准文件,文件系统的访问方法,文件执行,最后简要涉及持久存储和标准库中与文件有关的模块. 1 ...
- Python核心编程--学习笔记--8--条件与循环
本章讲述if.while.for以及与他们搭配的else.elif.break.continue.pass等语句. 1 if语句 语法:三部分——关键字if.条件表达式.代码块.(记住冒号) if c ...
- Python核心编程--学习笔记--7--字典和集合
本章介绍Python语言中的映射类型(字典)和集合类型,包括操作符.工厂函数.内建函数与方法. 1 字典 字典是Python中唯一的映射类型——键key直接映射到值value.字典是容器类型,其对象是 ...
随机推荐
- django中只使用ModleForm的表单验证,而不使用ModleForm来渲染
主题 众所周知,django.forms极其强大,不少的框架也借鉴了这个模式,如Scrapy.在表单验证时,django.forms是一绝,也是面向对象的经典表现.但要用它来渲染表单那就不好玩了,除非 ...
- 读python代码-学到的python函数-1
1.with open(data_path,'r') as f: with open()是python用来打开本地文件的,他会在使用完毕后,自动关闭文件,无需手动书写close(). 三种打开模式: ...
- asp前端无法获取后端中select *查询带出来的全部字段
1.环境 前端:ASP.vbscript 后端:vb 数据库:Sql Server 2.问题描述 最近在做需求时碰到一个很奇怪的问题,后端通过select *查询带出来的字段,在前端只能获取到部分字段 ...
- 数论专项复习(一)扩展欧几里得算法(exgcd)
简介 扩展欧几里得算法(简称扩欧,exgcd),用来求下列方程的一组解: \[ax+by=(a,b) \] 算法介绍 1. 裴蜀定理 裴蜀定理(Bézout's lemma):若 \(a\in \ma ...
- px批量转vw方法,适用于用户临时突发自适应需求,快速搞出项目多屏幕适应方案postcss-px-to-viewport,postcss.config.js配置
方案一: 1. 下载依赖 npm install postcss-import postcss-loader postcss-px-to-viewport --save-dev npm install ...
- HashSet集合存储数据的结构(哈希表)-Set集合存储元素不重复的原理
HashSet集合存储数据的结构(哈希表) 在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里.但是当位于一个桶中的元素较多,即hash值相等 ...
- Docker+nginx部署前后端分离项目
1.下载Docker和Docker-Compose 1.安装Docker 记一次踩坑:误装podman-docker 问题概述:Centos8去下载Docker时,默认装的是podman-docker ...
- 论文翻译:2020:ECAPA-TDNN: Emphasized Channel Attention, Propagation and Aggregation in TDNN Based Speaker Verification
论文地址:ECAPA-TDNN:在基于TDNN的说话人验证中强调通道注意.传播和聚集 论文代码:https://github.com/TaoRuijie/ECAPA-TDNN 引用格式:Desplan ...
- 线上排查:内存异常使用导致full gc频繁
线上排查:内存异常使用导致full gc频繁 问题系统 日常巡检发现,应用线上出现频繁full gc 现象 应用线上出现频繁full gc 排查过程 分析dump 拉dump文件:小插曲:dump时如 ...
- MySQL 如何实现数据更新
一般在更新时会遇到以下场景:1.所有字段全部更新:2.根据条件更新字段中的某部分内容:3.根据不同的条件更新不同的值,以下是几种场景中常用的update方法. 一.方法分类 二.具体用法 (1)根据条 ...