进程
进程是操作系统分配内存的基本单位,进程之间的单位是相互隔离的
进程之间的交换数据要IPC机制
线程
一个进程又可以进一步划分成多个线程,线程是进程的执行单元,也是操作系统分配CPU的基本单元。
为什么要使用多进程和多线程
多线程
为了得到更多的CPU调度。
多进程
好处
1、把一个耗时间的任务,分解为多个进程或者多个线程一起操作。提升执行效率,缩短程序的执行时间。
2、使用多线程可以改善用户体验。
多进程程序对其他程序是不友好的
# 钩子函数(hook)/回调函数
def run(self):
download(self._filename)
这种函数知道什么时候用,不知道什么时候触发。
- 当多个线程同时访问一个资源的时候,就有可能因为竞争资源导致状态错误
- 被多个线程访问的资源我们通常称之为临界资源,对临界资源的访问需要加上保护
点我返回目录 - 用多线程下载图片
from threading import Thread
import requests
import json
class DownloadTask(Thread):
def __init__(self, url):
super().__init__()
self._url = url
def run(self):
resp = requests.get(self._url)
filename = self._url[self._url.rfind('/') + 1:]
try:
with open(filename,'wb') as fs:
fs.write(resp.content)
except IOError as e:
print(e)
def main():
# request / response
resp = requests.get('http://api.tianapi.com/meinv/?key=34d7ac914cfb754622b1a1cba8f80aff&num=10')
mydict = json.loads(resp.text)
threads = []
for tempdict in mydict['newslist']:
pic_url = tempdict['picUrl']
thread = DownloadTask(pic_url)
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
print('图片下载完成!')
if __name__ == '__main__':
main()
- 多线程模拟银行汇款操作
import time
from threading import Thread, Lock
class Account(object):
def __init__(self):
self._balance = 0
self._lock = Lock()
@property
def balance(self):
return self._balance
def deposit(self, money):
if money > 0:
self._lock.acquire()
try:
new_balance = self._balance + money
time.sleep(0.01)
self._balance = new_balance
finally:
self._lock.release()
class AddMoneyThread(Thread):
def __init__(self, account):
super().__init__()
self._account = account
def run(self):
self._account.deposit(1)
def main():
start = time.time()
account = Account()
tlist = []
for _ in range(100):
t = AddMoneyThread(account)
tlist.append(t)
t.start()
for t in tlist:
t.join()
print('账户余额:%d元' % account.balance)
end = time.time()
print('总共消耗%f秒' % (end-start))
if __name__ == '__main__':
main()
计算机网络
多台独立自主的计算机,放在一起,形成一个系统,叫计算机网络
网络编程
创建一个基于TCP一些的聊天服务器
from socket import socket
from threading import Thread
# TCP - Transfer Control Protocol
# UDP - User Datagram Protocol
def main():
class RefreshScreenThread(Thread):
def __init__(self, client):
super().__init__()
self._client = client
def run(self):
while running:
data = self._client.recv(1024)
print(data.decode('utf-8'))
nickname = input('请输入你的昵称:')
myclient = socket()
myclient.connect(('10.7.189.118', 12345))
running = True
RefreshScreenThread(myclient).start()
while running:
content = input('请发言:')
if content == 'byebye':
myclient.send(content.encode('utf-8'))
running = False
else:
msg = nickname + ':' + content
myclient.send(msg.encode('utf-8'))
if __name__ == '__main__':
main()
创建基于聊天服务器的客户端,可以多人连接上去对话
from socket import socket
from threading import Thread
def main():
class ClientHandler(Thread):
def __init__(self, client):
super().__init__()
self._client = client
def run(self):
while True:
try:
data = self._client.recv(1024)
if data.decode('utf-8') == 'byebye':
client.remove(self._client)
self._client.close()
break
else:
for client in clients:
client.send(data)
except Exception as e:
print(e)
client.remove(self._client)
break
server = socket()
server.bind(('10.7.189.63', 9999))
server.listen(512)
clients = []
while True:
curr_client, addr = server.accept()
print(addr[0],'进入聊天室')
clients.append(curr_client)
ClientHandler(curr_client).start()
if __name__ == '__main__':
main()
名词科普
名词科普 | 英文全称 | 内容解释 |
---|---|---|
HTTP | Hyper Text Transfer Protocol | 超文本传输协议 |
SMTP | Simple Mail Transfer Protocol | 简单邮件传输协议 |
POP3 | Post Offce Protocol version3 | 邮局协议 |
IMAP | Internet Mail Access Protocol | 交互邮件访问协议 |
Telnet | TCP/IP协议 | Internet远程登陆服务的标准协议和主要方式 |
FTP | File Transfer Protocol | 文件传输协议,中文简称为“文传协议” |
TCP/IP | Transmission Control Protocol/Internet Protocol | 传输控制协议/因特网互联协议 |
netstat -na | 查看网络活动链接 | |
telnet | 加入IP地址和端口 | 连接ip地址 |
碎片单词记忆块
单词 | 翻译 |
---|---|
process | 进程 |
thread | 线程 |
mult | 多 |
subprocess | 子进程 |
marine | 海,海平面的 |
submarine | 潜水艇 |
subprocess.call | 调用 |
socket | 插座 |