python单进程

ping

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import subprocess

def ping(host):
result = subprocess.run(
'ping -c2 %s &> /dev/null' % host,shell=True
)
if result.returncode == 0:
print('%s:up'% host)
else:
print('%s:down'% host)

if __name__ == '__main__':
ips = ['192.168.0.%s' %i for i in range(1,255)]
for ip in ips:
ping(ip)

这个会ping得很慢,因为要等待前一个进程得到结果才能运行下一个命令

多进程

ping2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import subprocess
import os

def ping(host):
result = subprocess.run(
'ping -c2 %s &> /dev/null' % host,shell=True
)
if result.returncode == 0:
print('%s:up'% host)
else:
print('%s:down'% host)

if __name__ == '__main__':
ips = ['192.168.0.%s' %i for i in range(1,255)]
for ip in ips:
ret_val = os.fork()
if not ret_val:
ping(ip)
exit()

这个就会很快,因为用了多进程的概念(注意:是多进程不是多线程)

Windows是没有多进程的概念的,只有多线程;Linux有多进程和多线程的概念,两者要注意分开!!!!

产生僵死进程

frozen_process

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import os
import time

print('starting')
ret_val = os.fork()

if ret_val:
print('in parent')
time.sleep(30)
print('parent done')
else:
print('in child')
time.sleep(15)
print('child done')

image-20231023104631420

image-20231023104703212

线程挂起与不挂起_os.waitpid()

1
2
os.waitpid(-1,0) # 挂起父进程,子进程会被父进程看管,子进程一旦干完活马上被父进程杀死。期间不会产生僵死进程
os.waitpid(-1,1) # 不挂起父进程,子进程不会被父进程看管,会产生僵死进程。如父进程时间到了,结束了进程,子进程如果还有东西运行就继续运行下去(父进程迁移成为system),如果没有运行的东西(父进程迁移成为system)被system马上杀死

挂起父进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import os
import time

print('starting')
ret_val = os.fork()

if ret_val:
print('in parent')
result = os.waitpid(-1,0) # 挂起父进程
print(result) # result是元组:(子进程pid,0)
time.sleep(3)
print('parent done')
else:
print('in child')
time.sleep(5)
print('child done')

父进程print('in parent'),然后运行到os.waitpid(-1,0)父进程挂起,子进程干活print('in child'),睡觉5秒后print('child done'),父进程开始杀死子进程,并且打印print(result),睡觉3秒后print('parent done')

不挂起父进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import os
import time

print('starting')
ret_val = os.fork()

if ret_val:
print('in parent')
result = os.waitpid(-1,1) # 不挂起父进程
print(result) # result是元组:(0,0)
time.sleep(10)
print('parent done')
else:
print('in child')
time.sleep(5)
print('child done')

很多人学了Django是为了快速上线服务而学习的Django,而我是为了快速完成毕业设计的问题。由于学习速度太快,很多东西都没系统性消化。

某天,我在设置404页面的时候,官方要求将settings.py文件下面两个设置修改

1
2
DEBUG = True
ALLOWED_HOSTS = []

修改后

1
2
DEBUG = False
ALLOWED_HOSTS = ['*']

修改完成之后,所有的静态资源都无法找到,而我写的前端登录界面就只有个框架(html),而css、images、js这些全部没了。

image-20231018220605735

浏览器返回的报错是下面这样的

image-20231018220918553

而pycharm终端返回的报错则是404

image-20231018221454698

经过大量的资料查询,我发现Django官网给出了静态文件迁移的办法,就是在settings.py设置静态迁移文件路径,然后执行迁移程序

1
2
# 新增
STATIC_ROOT = os.path.join(BASE_DIR,'static')

控制终端执行迁移程序

1
python manage.py collectstatic

迁移过后,就在我的项目根目录生成了个static目录

image-20231018223112439

结果还是不行,网上很多人写什么在urls.py里面写拼接路径的,这些我都试过了,是绝对不可行的,而且csdn没有原创内容,都是互相抄袭。。。花了两天时间,我快绝望了准备放弃的时候,我无意中想到DEBUG = False貌似会让Django的一个中间件失效,也就是不会有Web前端静态文件的功能,只有这样有html框架没有cssimagesjs这样就解释清楚了。

那么,理论上就解释的通了,通过Nginx、Apache作为Web服务器,访问静态迁移文件即可。