目录
如果你需要利用多核处理器进行真正的并行计算,你应该考虑使用多进程而不是多线程。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- 系统日志分析器
8万+

被折叠的 条评论
为什么被折叠?



