前言

最近写一些模拟集群智能的算法,虽然机制简单,但是随着个体的增加,设计的计算量就比较大了,尤其是加上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 并行编程学习笔记(一)的更多相关文章

  1. python 函数式编程学习笔记

    函数基础 一个函数就是将一些语句集合在一起的部件,它们能够不止一次地在程序中运行.函数的主要作用: 最大化的代码重用和最小化代码冗余 流程的分解 一般地,函数讲的流程是:告诉你怎样去做某事,而不是让你 ...

  2. Python核心编程--学习笔记--1--Python简介

    本章介绍了Python的背景知识,包括什么是Python.Python的起源以及Python的一些关键特性. 1 什么是Python Python是一门优雅而健壮的编程语言,它继承了传统编译语言的强大 ...

  3. python网络编程学习笔记(三):socket网络服务器(转载)

    1.TCP连接的建立方法 客户端在建立一个TCP连接时一般需要两步,而服务器的这个过程需要四步,具体见下面的比较. 步骤 TCP客户端 TCP服务器 第一步 建立socket对象  建立socket对 ...

  4. Python核心编程--学习笔记--4--Python对象

    现在开始学习Python语言的核心部分.首先了解什么是Python对象,然后讨论最常用的内建类型,接下来讨论标准类型运算符和内建函数,之后给出对标准类型的不同分类方式,最后提一提Python目前还不支 ...

  5. Python核心编程--学习笔记--3--Python基础

    本章介绍基本的Python语法.编程风格:并简要介绍标识符.变量和关键字,以及变量占用内存的分配和回收:最后给出一个较大的Python样例程序来体验这些特性. 1 语句和语法 1.1 注释 可以在一行 ...

  6. python网络编程学习笔记(10):webpy框架

    转载请注明:@小五义http://www.cnblogs.com/xiaowuyi django和webpy都是python的web开发框架.Django的主要目的是简便.快速的开发数据库驱动的网站. ...

  7. python多进程编程学习笔记

    摘自[https://www.cnblogs.com/chenhuabin/p/10070996.html] by 奥辰 赞

  8. Python核心编程--学习笔记--9--文件和输入输出

    本章将深入介绍Python的文件处理和相关输入输出能力,包括:文件对象(以及它的内建函数.内建方法和属性),标准文件,文件系统的访问方法,文件执行,最后简要涉及持久存储和标准库中与文件有关的模块. 1 ...

  9. Python核心编程--学习笔记--8--条件与循环

    本章讲述if.while.for以及与他们搭配的else.elif.break.continue.pass等语句. 1 if语句 语法:三部分——关键字if.条件表达式.代码块.(记住冒号) if c ...

  10. Python核心编程--学习笔记--7--字典和集合

    本章介绍Python语言中的映射类型(字典)和集合类型,包括操作符.工厂函数.内建函数与方法. 1 字典 字典是Python中唯一的映射类型——键key直接映射到值value.字典是容器类型,其对象是 ...

随机推荐

  1. 【转载】EXCEL VBA 工作表拆分

    用VBA拆分工作表是一个不错的方法,特别是在处理大量数据的时候,能节省不少时间.   1.高级筛选: 筛选并复制到新工作表的关键代码如下: Range("Database").Ad ...

  2. TiDB上百T数据拆分实践

    背景 提高TiDB可用性,需要把多点已有上百T TiDB集群拆分出2套 挑战 1.现有需要拆分的12套TiDB集群的版本多(4.0.9.5.1.1.5.1.2都有),每个版本拆分方法存在不一样 2.其 ...

  3. java后端整合极光消息推送

    目录 1.简介 2.极光Demo 2.1.进入极光官网--应用管理 2.2.快速集成一个Android/iOS的SDK​ 2.3.java服务端代码 3.参考资料 1.简介 简单来说,就是androi ...

  4. Node.js躬行记(26)——接口拦截和页面回放实验

    最近在研究 Web自动化测试,之前做了些实践,但效果并不理想. 对于 QA 来说,公司的网页交互并不多,用手点点也能满足.对于前端来说,如果要做成自动化,就得维护一堆的脚本. 当然,这些脚本也可以 Q ...

  5. centos7.6安装本地yum源

    centos7.6安装本地yum源 前言:文章内容可能会因环境不同而有所差异,所谓集思广益说不定灵感就来了呢; 文章初衷旨在交流学习.记录个人成长,如果能帮助到您,那就点个赞噢. 环境说明: 1.本实 ...

  6. windows11预览版装WSA心得

    这两天心血来潮想要装个WSA(安卓windows子系统),原来一直用的安卓模拟器(mumu啊蓝叠啊逍遥啊),但感觉像wsa这种安卓系统与主系统融合的模式更带感,于是开始了我艰苦的安装(瞎捯饬)之路 我 ...

  7. react 高效高质量搭建后台系统 系列 —— 系统布局

    其他章节请看: react 高效高质量搭建后台系统 系列 系统布局 前面我们用脚手架搭建了项目,并实现了登录模块,登录模块所依赖的请求数据和antd(ui框架和样式)也已完成. 本篇将完成系统布局.比 ...

  8. 特定领域知识图谱融合方案:文本匹配算法(Simnet、Simcse、Diffcse)

    特定领域知识图谱融合方案:文本匹配算法(Simnet.Simcse.Diffcse) 本项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5 ...

  9. 练习_使用递归计算1-n之间的和-练习_使用递归计算阶乘

    练习_使用递归计算1-n之间的和 定义一个方法,使用递归计算1-n之间的和 1+2+3+. . .+n n+(n-1)+(n-2)+...+1 已知: 最大值:n 最小值:1 使用递归必须明确: 1. ...

  10. Unity之UGUI鼠标进入离开&&拖拽实现

    Unity之UGUI鼠标进入离开&&拖拽实现 前言: __小黑最近在写项目的时候就有个疑惑,UGUI中的Button组件,他的点击事件是怎么实现的!?我们自己能不能写一个!?之后在项目 ...