目录
如果你需要利用多核处理器进行真正的并行计算,你应该考虑使用多进程而不是多线程。Python的multiprocessing模块提供了进行真正并行计算的工具。
函数定义,判断字符串是否包含子字符串:
def contains_substring(a, b):
return b in a
# 使用示例
result = contains_substring("welcome to my world", "world")
print(result) # 输出: True 或 False 根据实际情况
使用Django ORM过滤出特定name的语句:
from django.db import models
# 假设 DiagramNode 模型已经定义好,并且已经迁移到数据库
# 过滤出 name="test_name" 的所有对象列表
objects_list = DiagramNode.objects.filter(name="test_name")
关于Django的事务:
transaction.atomic
是Django的一个上下文管理器,用于确保数据库操作在一个事务块中执行。如果块中的操作发生异常,事务将回滚到开始状态,保证数据的一致性。from_account.balance -= amount
和to_account.balance += amount
是账户资金的转移操作。from_account.save()
和to_account.save()
将更改保存到数据库。try...except...else
结构用于捕获并处理可能发生的异常。如果事务块中的操作成功完成,将执行else
块中的代码,打印"successfully"。
transaction.atomic
的作用是确保在transfer_funds
函数中执行的数据库操作要么全部成功,要么在出现错误时全部撤销,这样可以防止数据库状态的不一致。
使用with
语句写文件操作,并说明with
方法的优点:
with open('./test.txt', 'wb') as f:
try:
f.write("hello world")
except:
pass
# with方法的优点:
# - 确保文件在使用后正确关闭,即使发生异常也会执行finally块中的代码。
# - 代码更加简洁,减少了冗余的try...finally结构。
# - 提供了一种更好的资源管理方式,使得文件操作更加安全。
使用map()
函数和列表推导式处理列表:
# 原始列表
original_list = [1, 2, 3, 4, 5]
# 使用map()函数将列表中的每个元素平方
squared_list = map(lambda x: x**2, original_list)
# 使用列表推导式提取出大于10的数
filtered_list = [x for x in squared_list if x > 10]
print(list(filtered_list)) # 输出: [16, 25]
注意:map()函数返回的是一个map对象,如果你需要打印或者转换为列表,需要使用list()函数进行转换。在上述代码中,我直接将map对象转换为了列表并打印出来。
在这个例子中,lambda x: x**2
是一个匿名函数,它接受一个参数 x
并返回 x
的平方。map()
函数将这个函数应用到 original_list
列表中的每个元素上,生成一个新的迭代器 squared_list
,其中包含了原始列表每个元素的平方值。
最后,我们使用 list()
函数将 squared_list
转换为列表,这样就可以打印出结果了。注意,map()
函数本身并不会修改原始列表,它只是生成了一个新的迭代器。
map()
函数是 Python 中的一个内置函数,它接受一个函数和一个可迭代对象作为参数,然后返回一个 map 对象。map()
函数会对可迭代对象中的每个元素应用传入的函数,并返回一个新的迭代器。
这里是 map()
函数的一些关键点:
-
参数:
- 第一个参数是一个函数,这个函数将被应用到可迭代对象的每个元素上。
- 第二个参数是一个可迭代对象,比如列表、元组等。
-
返回值:
map()
返回的是一个 map 对象,这是一个迭代器,可以被用来迭代处理过后的元素。
-
使用 lambda 函数:
lambda
是 Python 中的匿名函数,它允许你定义一个简短的函数。在map()
函数中使用lambda
可以避免定义一个完整的函数。
-
转换为列表:
- 由于
map()
返回的是一个迭代器,如果你想要得到一个列表,可以使用list()
函数将迭代器转换为列表。
- 由于
-
使用场景:
- 当你想要对一个序列的所有元素执行同一个操作时,使用
map()
是非常方便的。
- 当你想要对一个序列的所有元素执行同一个操作时,使用
单例模式
class Singleton:
__instance = None
def __new__(cls, age, name):
if cls.__instance is None:
cls.__instance = object.__new__(cls)
cls.__instance.age = age
cls.__instance.name = name
return cls.__instance
# 创建实例
a = Singleton(19, "test")
b = Singleton(20, "test2")
# 打印属性
print(b.age) # 打印的是什么值? 19
print(b.name) # test
当 Singleton
类的实例第一次被创建时,__instance
被初始化。当再次尝试创建第二个实例(通过 b = Singleton(20, "test2")
),__new__
方法检查 __instance
是否已经存在;如果存在,它不会创建新的实例,而是返回已经存在的 __instance
。
因此,尽管在创建 b
时传入了 age
为 20
,但是 b
实际上引用的是与 a
相同的实例
Python多线程和多进程:
- 多线程:Python中由于全局解释器锁(GIL)的存在,多线程在执行CPU密集型任务时可能不会带来性能上的提升,因为GIL限制了同一时刻只有一个线程可以执行Python字节码。但在I/O密集型任务中,多线程可以提高性能,因为线程可以在等待I/O操作时让其他线程运行。
- 多进程:Python的多进程可以绕过GIL的限制,因为每个进程有自己的Python解释器和内存空间,因此可以利用多核CPU的优势并行执行。多进程适用于CPU密集型任务。
全局解释器锁(GIL)
全局解释器锁(Global Interpreter Lock,简称GIL) 是 Python 解释器在执行时使用的一种机制,用来同步线程的执行,以避免多线程在执行 Python 字节码时发生冲突。GIL 确保在任何时刻,只有一个线程在执行 Python 字节码。
为什么需要 GIL?
- 内存管理:Python 使用引用计数机制来管理内存,当一个对象的引用计数降到0时,会被垃圾回收。如果没有 GIL,多个线程同时修改对象的引用计数可能会导致内存泄漏或不一致。
- 简化实现:GIL 简化了 CPython(Python 的官方实现)的内存管理和垃圾回收机制,避免了复杂的并发控制。
- 兼容性:许多 Python 扩展模块(如 NumPy)在设计时考虑了 GIL 的存在,它们在执行时需要 GIL 来保证线程安全。
GIL 的限制
- 单线程执行:尽管 GIL 允许多线程存在,但在任何时刻只有一个线程可以执行 Python 字节码。这意味着在 CPU 密集型任务中,多线程并不能带来性能提升,反而因为线程切换和锁的开销导致性能下降。
- 阻塞 I/O:在执行 I/O 操作(如文件读写、网络通信)时,GIL 会被释放,允许其他线程运行。但如果 I/O 操作是阻塞的,GIL 仍然会被持有,影响其他线程的执行。
多线程
多线程 是一种并发执行的方式,允许一个程序中的多个线程同时运行。在 Python 中,多线程主要用于提高程序的并发性,尤其是在 I/O 密集型任务中。
多线程的优点
- 提高响应性:多线程可以提高程序的响应性,尤其是在处理用户界面或网络通信时。
- 利用多核 CPU:通过多线程,可以更好地利用多核 CPU 的计算能力,尤其是在 I/O 密集型任务中。
- 简化编程模型:多线程提供了一种相对简单的并发编程模型,易于理解和实现。
多线程的缺点
- GIL 的限制:由于 GIL 的存在,Python 的多线程在 CPU 密集型任务中并不能有效提高性能。
- 线程同步问题:多线程需要处理线程之间的同步和互斥,增加了编程的复杂性。
- 资源限制:每个线程都需要分配一定的系统资源(如内存),过多的线程可能会消耗大量的系统资源。
·
import threading
def worker():
print("Thread started")
# 执行一些任务
print("Thread finished")
# 创建线程
t = threading.Thread(target=worker)
t.start() # 启动线程
# 等待线程完成
t.join()
在这个示例中,我们定义了一个 worker
函数,作为线程的执行目标。通过 threading.Thread
创建了一个线程,并调用 start()
方法启动线程。最后,通过 join()
方法等待线程完成。
总结
尽管 GIL 限制了 Python 多线程在 CPU 密集型任务中的应用,但在 I/O 密集型任务中,多线程仍然是一种有效的并发执行方式。理解 GIL 的工作原理和多线程的使用方式,可以帮助你更好地利用 Python 进行并发编程。
Python的全局解释器锁(GIL)限制了多线程的并行执行能力。GIL确保了任何时候都只有一个线程在运行Python字节码。尽管在某些操作中线程看起来是并行的,但这主要是由于线程在I/O操作时会释放GIL,允许其他线程执行。
多进程
如果你需要利用多核处理器进行真正的并行计算,你应该考虑使用多进程而不是多线程。Python的multiprocessing
模块提供了进行真正并行计算的工具。
以下是一个使用multiprocessing
模块的简单例子:
from multiprocessing import Process
def worker(num):
print(f"Worker {num} is running")
def main():
processes = []
for i in range(4):
p = Process(target=worker, args=(i,))
p.start()
processes.append(p)
for p in processes:
p.join()
if __name__ == "__main__":
main()
性能优化的常用手段:
- 后端优化:
- 代码优化:减少冗余代码,使用更高效的算法。
- 缓存:使用内存缓存常用数据,减少数据库访问。
- 异步处理:使用异步I/O操作提高响应速度。
- 负载均衡:合理分配请求到多个服务器。
- 数据库优化:
- 索引:为数据库表添加合适的索引,加速查询速度。
- 查询优化:编写高效的SQL查询,避免全表扫描。
- 规范化与反规范化:根据需要进行数据模型设计。
- 分库分表:水平或垂直分割数据库以提高性能。
常用的linux命令
文件和目录操作
ls
- 列出目录内容ls -l
显示详细列表
cd
- 改变当前目录cd /home/user
切换到 /home/user 目录
pwd
- 显示当前工作目录cp
- 复制文件或目录cp file1 file2
复制 file1 到 file2
mv
- 移动或重命名文件或目录mv file1 file2
移动 file1 到 file2
rm
- 删除文件或目录rm file1
删除 file1
rmdir
- 删除空目录rmdir dir1
删除空目录 dir1
mkdir
- 创建新目录mkdir dir1
创建新目录 dir1
touch
- 创建空文件或更新文件时间戳touch file1
创建空文件 file1
cat
- 显示文件内容cat file1
显示 file1 的内容
echo
- 显示文本或字符串echo "Hello World"
显示 "Hello World"
more
- 分页显示文件内容more file1
分页显示 file1 的内容
less
- 分页显示文件内容,支持向前翻页less file1
分页显示 file1 的内容
head
- 显示文件的前几行head -n 5 file1
显示 file1 的前 5 行
tail
- 显示文件的最后几行tail -n 5 file1
显示 file1 的最后 5 行
grep
- 搜索文件中的文本模式grep "pattern" file1
在 file1 中搜索 "pattern"
find
- 在目录树中查找文件find /home/user -name file1
在 /home/user 中查找名为 file1 的文件
chmod
- 更改文件或目录的权限chmod +x file1
使 file1 可执行
chown
- 更改文件或目录的所有者chown user file1
将 file1 的所有者更改为 user
chgrp
- 更改文件或目录的所属组chgrp group file1
将 file1 的组更改为 group
系统管理
top
- 显示系统进程和资源使用情况htop
- 显示系统进程和资源使用情况(增强版)ps
- 显示当前进程状态ps aux
显示所有进程的状态
kill
- 发送信号给进程kill PID
发送信号给进程 ID
pkill
- 按名称杀死进程pkill process_name
杀死所有名为 process_name 的进程
nice
- 更改进程的优先级nice -n 10 command
以低优先级运行 command
renice
- 更改运行中进程的优先级renice -n 10 -p PID
更改进程 ID 的优先级
nohup
- 忽略挂断信号运行命令nohup command &
忽略挂断信号运行 command
timeout
- 运行命令并限制其执行时间timeout 10 command
运行 command 并限制其执行时间为 10 秒
sleep
- 暂停指定的时间sleep 10
暂停 10 秒
date
- 显示或设置系统日期和时间date
显示当前日期和时间
cal
- 显示日历uptime
- 显示系统运行时间和负载w
- 显示当前登录用户和他们正在做的事情who
- 显示当前登录用户whoami
- 显示当前用户的用户名su
- 切换用户su - user
切换到用户 user
sudo
- 以超级用户权限运行命令sudo command
以超级用户权限运行 command
网络配置
ifconfig
- 配置或显示网络接口的网络参数ip
- 显示或管理路由、网络设备、接口和隧道ping
- 测试网络连接ping google.com
测试到 google.com 的连接
traceroute
- 显示数据包到达目的地的路径traceroute google.com
显示到 google.com 的路径
netstat
- 显示网络连接、路由表、接口统计等网络信息ssh
- 安全外壳协议,用于远程登录或其他网络服务ssh user@server
登录到服务器 server 作为用户 user
磁盘和文件系统管理
df
- 显示磁盘空间使用情况du
- 显示文件或目录的磁盘使用情况du -sh directory
显示目录的总大小
fdisk
- 显示或操作磁盘分区表mkfs
- 创建文件系统mkfs -t ext4 /dev/sda1
在 /dev/sda1 上创建 ext4 文件系统
mount
- 挂载文件系统mount /dev/sda1 /mnt
将 /dev/sda1 挂载到 /mnt
umount
- 卸载文件系统umount /mnt
卸载 /mnt 挂载点
压缩和解压缩
tar
- 打包压缩文件tar -czvf archive.tar.gz directory
将目录打包并压缩为 archive.tar.gz
gzip
- 压缩文件gzip file1
压缩 file1
gunzip
- 解压缩 gzip 文件gunzip file1.gz
解压缩 file1.gz
zip
- 创建 zip 压缩文件zip archive.zip file1 file2
将 file1 和 file2 打包为 archive.zip
unzip
- 解压缩 zip 文件unzip archive.zip
解压缩 archive.zip
文本处理
sed
- 流编辑器sed 's/old/new/g' file1
将 file1 中的所有 "old" 替换为 "new"
awk
- 文本处理工具awk '{print $1}' file1
打印 file1 的每一行的第一个字段
sort
- 对文本行进行排序sort file1
对 file1 的行进行排序
uniq
- 报告或忽略重复的行sort file1 | uniq
从 file1 中提取不重复的行
wc
- 计算字数wc file1
计算 file1 的行数、单词数和字节数
系统监控
free
- 显示内存状态top
- 显示系统进程和资源使用情况htop
- 显示系统进程和资源使用情况(增强版)vmstat
- 报告关于进程、内存、分页、块 IO、陷阱和 CPU 的统计信息iostat
- 报告 CPU 和输入/输出统计信息mpstat
- 报告 CPU统计信息netstat
- 显示网络连接、路由表、接口统计等网络信息
系统启动和关机
reboot
- 重启系统shutdown
- 安全关闭系统shutdown -h now
立即关闭系统
权限和所有权
chmod
- 更改文件或目录的权限chown
- 更改文件或目录的所有者chgrp
- 更改文件或目录的所属组
链接
-
ln
- 创建链接(硬链接或符号链接) -
ln -s link_name target
创建指向目标的符号链接 link_name
软件包管理
apt-get
- Debian/Ubuntu 的包管理工具apt-get install package_name
安装 package_name
yum
- RedHat/CentOS 的包管理工具yum install package_name
安装 package_name
dnf
- Fedora 的包管理工具rpm
- 包管理工具dpkg
- Debian 的包管理工具
网络文件系统
mount
- 挂载文件系统umount
- 卸载文件系统
用户和群组管理
useradd
- 添加用户useradd username
添加新用户 username
userdel
- 删除用户userdel username
删除用户 username
groupadd
- 添加组groupadd groupname
添加新组 groupname
groupdel
- 删除组groupdel groupname
删除组 groupname
服务管理
systemctl
- 管理服务systemctl start service_name
启动服务 service_name
service
- 管理服务service service_name start
启动服务 service_name
系统信息
uname
- 显示系统信息lsb_release
- 显示 Linux 发行版信息hostname
- 显示或设置系统的主机名
定时任务
cron
- 定时任务at
- 安排一次性任务
系统备份
rsync
- 文件复制和同步rsync -avz source destination
同步 source 到 destination
dd
- 数据复制和转换
系统安全
iptables
- 防火墙管理firewalld
- 防火墙管理(CentOS 7+)
系统日志
dmesg
- 打印或控制内核环形缓冲区journalctl
- 查看和管理系统日志和服务日志logrotate
- 日志文件轮换
脚本和自动化
bash
- 运行 Bash 脚本sh
- 运行 Shell 脚本
其他
alias
- 创建命令别名history
- 显示命令历史whatis
- 显示命令的简短描述apropos
- 搜索手册页的简短描述man
- 显示手册页 -man command
显示 command 的手册页
文件查找
locate
- 快速查找文件(需要事先构建索引)which
- 查找命令的路径
磁盘空间
df
- 报告文件系统磁盘空间使用情况du
- 估计文件或目录的磁盘使用空间
网络工具
wget
- 非交互式下载文件curl
- 数据传输工具
系统监控
iotop
- 显示或累计进程的磁盘 I/Onmon
- 性能监控工具
系统启动
init
- 运行不同的运行级别telinit
- 改变运行级别
系统调试
strace
- 跟踪系统调用和信号gdb
- GNU 调试器
用户认证
passwd
- 更改用户密码sudo
- 以另一个用户身份执行命令
版本控制
git
- 分布式版本控制系统
软件包管理(高级)
apt
- 高级包管理工具yum-utils
- 添加额外的 YUM 功能
系统配置
sysctl
- 读取和设置系统参数getconf
- 显示系统配置变量的值
系统调用
syscall
- 直接执行系统调用
系统资源限制
ulimit
- 控制 shell 启动进程的资源限制
系统引导
lilo
- Linux 引导加载程序grub
- GRand Unified Bootloader
系统服务
service
- 运行系统服务systemd
- 系统和服务管理器
系统更新
update
- 更新系统软件包upgrade
- 升级系统软件包
系统维护
chkconfig
- 管理系统服务的启动和停止insserv
- 检查和链接服务脚本
系统安全(高级)
semanage
- 管理 SELinux 安全策略sestatus
- 显示 SELinux 安全状态
系统备份(高级)
bacula
- 网络备份解决方案amanda
- 高级 Maryland自动网络磁盘归档器
系统日志(高级)
logwatch
- 系统日志分析器sar
- 系统活动报告器
系统监控(高级)
nethogs
- 网络带宽使用监控工具iftop
- 实时网络带宽监控工具
系统调试(高级)
valgrind
- 内存调试工具memtest
- 内存测试工具
系统资源限制(高级)
setquota
- 设置磁盘配额quota
- 显示磁盘配额
系统引导(高级)
dracut
- 动态生成 initramfs 的工具
系统服务(高级)
system-config-*
- 系统服务配置工具
系统更新(高级)
aptitude
- 高级包管理工具
系统维护(高级)
anacron
- 定时运行命令
系统安全(高级)
apparmor
- 应用程序安全策略
系统备份(高级)
rdiff-backup
- 数据备份工具
系统日志(高级)
logrotate
- 日志文件轮换
系统监控(高级)
glances
- 跨平台系统监控工具
系统调试(高级)
strace
- 跟踪系统调用和信号
系统资源限制(高级)
cgroups
- 控制组,用于资源限制和优先级管理
系统引导(高级)
bootctl
- 引导加载程序配置工具
系统服务(高级)
system-config-services
- 系统服务配置工具
系统更新(高级)
zypper
- SUSE 的包管理工具
系统维护(高级)
crontab
- 定时任务配置工具
系统安全(高级)
firewall-cmd
- 防火墙管理工具
系统备份(高级)
duplicity
- 文件备份工具
系统日志(高级)
rsyslog
- 系统日志服务
系统监控(高级)
collectl
- 系统性能监控工具
系统调试(高级)
gdbserver
- 远程调试服务器
系统资源限制(高级)
lvm
- 逻辑卷管理工具
系统引导(高级)
grub2
- GRUB2 引导加载程序
系统服务(高级)
service
- 管理系统服务
系统更新(高级)
dnf
- Fedora 的包管理工具
系统维护(高级)
logadm
- 日志管理工具
系统安全(高级)
semanage
- SELinux 安全策略管理工具
系统备份(高级)
bacula-fd
- Bacula 文件守护进程
系统日志(高级)
auditd
- Linux 审计系统
系统调试(高级)
perf
- Linux 性能分析工具
系统资源限制(高级)
cgroupfs
- 控制组文件系统
系统引导(高级)
liloconfig
- LILO 配置工具
系统服务(高级)
rc
- 运行命令
系统更新(高级)
microcode_ctl
- CPU 微代码更新工具
系统维护(高级)
anacron
- 定时运行命令
系统安全(高级)
apparmor_parser
- AppArmor 安全策略解析器
系统备份(高级)
rsync
- 文件复制和同步工具
系统日志(高级)
syslog-ng
- 系统日志服务
系统监控(高级)
ganglia
- 系统监控工具
系统调试(高级)
ltrace
- 跟踪程序执行的动态库函数调用
系统资源限制(高级)
quotacheck
- 检查磁盘配额
系统引导(高级)
grub-install
- 安装 GRUB 引导加载程序
系统服务(高级)
systemd-analyze
- 分析 systemd 启动时间
系统更新(高级)
zypper
- SUSE 的包管理工具
系统维护(高级)
atd
- 定时任务守护进程
系统安全(高级)
sealert
- SELinux 警告管理工具
系统备份(高级)
tar
- 打包工具
系统日志(高级)
klogd
- Linux 内核日志服务
系统监控(高级)
nagios
- 系统监控工具
系统调试(高级)
ab
- Apache 基准测试工具
系统资源限制(高级)
quotaon
- 启用磁盘配额
系统引导(高级)
lilo
- Linux 引导加载程序
系统服务(高级)
systemd-sysv
- 转换 SysVinit 脚本到 systemd
系统更新(高级)
dnf-plugin-core
- DNF 插件管理工具
系统维护(高级)
logwatch
- 系统日志分析器