线程进程续和网络编程

本文探讨了多进程在利用多核CPU特性方面的优势,并通过代码示例展示了如何使用Python的多进程进行并行任务处理。此外,还介绍了网络编程的基础概念和技术,包括TCP/IP协议、服务器与客户端通信以及实时对话系统的实现。

线程和进程

  • 下面两段代码可以看到使用进程和不使用进程的差别

  • 如果多个任务之前没有任何关联(独立的子任务)而且希望利用cpu的多核特性

  • 那么我们推荐使用多进程

  • IT Information Technology 信息技术

  • 主宰IT行业的三个定律

  • 摩尔定律—每隔十八个月硬件性能就会翻倍 由于多核的出现,这个定律正在失效

  • 安迪比尔定律—安迪给你的东西都被比尔拿走了,硬件性能的提升,都被软件的复杂性抵消了

  • 反摩尔定律—如果你反过来看摩尔定律,一个IT公司如果今天和18个月前卖掉同样多的、同样的产品,它的营业额就要降一半。

import time
import random


def download(filename):
    print('开始下载%s...' % filename)
    delay = random.randint(5, 15)
    time.sleep(delay)

    print('%s下载完成, 用时%d秒' % (filename, delay))



def main():
    start = time.time()
    download('Python从入门到住院')
    download('Pekin Hot.avi')
    end = time.time()
    print('总共耗费了%f秒' % (end - start))


if __name__ == '__main__':
    main()
import time
import random
#from threading import Thread
from multiprocessing import Process #因为俩组没有数据交流,所以选择多进程


def download(filename):
    print('开始下载%s...' % filename)
    delay = random.randint(5, 15)
    time.sleep(delay)

    print('%s下载完成, 用时%d秒' % (filename, delay))


def main():
    start = time.time()
    p1 = Process(target=download, args=('Python从入门到住院',))
    p2 = Process(target=download, args=('Pekin Hot.avi',))
    p1.start()
    p2.start()
    p1.join()#等待p1进程结束再执行下面的语句
    p2.join()
    end = time.time()
    print('总共耗费了%f秒' % (end - start))


if __name__ == '__main__':
    main()
总共耗费了0.162009秒

网络编程

  • 多台独立自主的计算机形成一个系统,实现资源共享,交换数据。
  • 因特网 TCP/IP 协议 最大网络
"""
第二大里程碑 国际标准化组织
物理层:电气特性,两台机器如何理解0,1
数据链路层:切小片分组,冗余校验码
网络层:1.寻址 在命令行提示符输入ipconfig 查看计算机IP 2.路由 (网络中继设备)
传输层:报证端到端的可靠通信,TCP 1.数据不传丢不传错 2.流量控制 滑动窗口协议,由慢到快
逐渐适应两端传输速率3.拥塞控制       另一个协议 UDP协议 不做任何承诺 轻便 可能会传丢传错
应用层: 定义应用层的协议 HTTP协议 Hyper - Text Transfer Protocol超文本传输协议 https有s表示加密
SMTP - Simple Mail Transfer Protocol  发邮件的协议 - 25
POP3 - Post Offce Protocol version 3  收邮件的协议 - 110
IMAP - Internet Mail Access Protocao  收邮件的协议
QQ协议 - QQ私有协议
Telnet
FTP 

TCP/IP 模型 
协议族
"""

服务器

from socket import socket, AF_INET, SOCK_STREAM #导入套接字,AF_INET表示用IPv4来组网
import datetime #更好用的时间模块
#SOCK_STREAM 表示用TCP协议 SOCK_DGRAM 表示UDP协议
#netstat -na 查看那些端口正在监听服务
#telnet 远程连接
#telnet ip地址 端口号 来访问别人的服务器

def main():
    server = socket()  #默认ipv4 .tcp 创建一个基于TCP协议的套接字对象
    #因为我们做的是应用级的产品或服务所以可以利用现有的传输服务来实现数据传输
    server.bind(('你的IP', 你的端口)) #前面是IP地址,后面是端口号
    #绑定IP地址(网络上主机的身份表示)和端口(用来区分不同服务的IP地址的扩展)
    #服务器绑定操作 (ip地址, 端口()区分不同的服务)'127.0.0.1'永远指本机
    #开始监听客户端的连接
    server.listen(512)# 队列大小,不是越大越好,越大后面用户等待时间越长 512是一个公认好的等待时间

    print('服务器已经启动正在监听...')
    while True:
        #通过accept方法接收客户端连接
        #accept方法是一个阻塞式方法,如果没有客户端连上来
        #那么accept方法就会让代码阻塞 直到有客户端连接成功才会返回
        #accept方法返回一个元组 元组中的第一个值是代表客户端的对象
        #元组中的第二个值又是一个元组,其中有客户端的IP地址和客户端的端口
        #在浏览器上输可直接连接
        client,addr = server.accept()
        print(addr,'连接成功')
        client.send('hello'.encode('utf-8'))
        my_time = datetime.datetime.now() #返回当前的时间
        client.send(my_time.__str__().encode('utf-8'))
        client.close()


if __name__ == '__main__':
    main()

客户端

from socket import socket
#文件系统
#ipconfig /renew 重置网络


def main():
    client = socket()
    client.connect(('要访问的IP', 要访问的端口))
    data = client.recv(512) #缓冲区大小
    print(type(data))
    print(data.decode('utf-8')) #将受到的数据解码


if __name__ == '__main__':
    main()
"""
第三大里程碑
浏览器的发明

"""

套接字

  • C语言写好的函数


```python
#用线程下载图片
import requests
import json
from threading import Thread


def down(url):
    requ = requests.get(url)
    filename = url[url.rfind('/') + 1 :]
    try:
        with open('E:/Meinv/' + filename, 'wb') as fs:
            fs.write(requ.content)
    except IOError as e:
        print(e)
    print('下载完成')


def main():
    re = requests.get('http://api.tianapi.com/meinv/?key=&num=10')
    mydict = json.loads(re.text)
    for content in mydict['newslist']:
        myurl = content['picUrl']
        Thread(target=down, args=(myurl,)).start()



if __name__ == '__main__':
    main()

可实现实时对话的服务器和客户端

from socket import socket
from threading import Thread


class SendThread(Thread):

    def __init__(self, client):
        super(SendThread, self).__init__()
        self._client = client

    def run(self):
        while True:
            word = input('服务器:')
            self._client.send(word.encode('utf-8'))


class RecvThread(Thread):

    def __init__(self, client):
        super().__init__()
        self._client = client

    def run(self):
        while True:
            data = self._client.recv(1024)
            print(data.decode('utf-8'))


def main():

    server = socket()
    server.bind(('你的ip', 你的端口))
    server.listen(512)
    print('服务器正在监听....')
    while True:
        client, addr = server.accept()
        print(client)
        s = SendThread(client)
        s.start()
        r = RecvThread(client)
        r.start()







if __name__ == '__main__':
    main()

from socket import socket
#ipconfig /renew 重置网络
from threading import Thread


class SendThread(Thread):

    def __init__(self, client):
        super(SendThread, self).__init__()
        self._client = client

    def run(self):
        while True:
            word = input('客户端:')
            self._client.send(word.encode('utf-8'))


class RecvThread(Thread):

    def __init__(self, client):
        super().__init__()
        self._client = client

    def run(self):
        while True:
            data = self._client.recv(1024)
            print(data.decode('utf-8'))

def main():

    client = socket()
    client.connect(('要访问的IP', 要访问的端口))
    s = SendThread(client)
    s.start()
    r = RecvThread(client)
    r.start()



if __name__ == '__main__':
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值