python2多线程_多进程_例程

使用python实现多线程:

首先python的多线程是一种假的多线程;

 

以下是线程,进程的一些定义:

线程的简要定义是:线程都是作为利用CPU的基本单位,可并发执行,可以是程序中一个独立运行的片段,是花费最小开销实体

进程的简要定义是:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体

多线程的简要定义是:多个线程并发执行的技术。

多进程的简要定义是:一个父进程创建了几个子进程(相当于一个两个没啥关系的python程序合到一个python文件中)

可以用生物学上的作为类比:比如人体的各种器官同时工作才能维持人体的稳定,可以类比为多进程处理不同的事情,以这次新型冠状病毒为例,进程类比为免疫器官,而线程就是各种免疫细胞,进程的目的是为了消灭病毒,就申请了很多的能量和物质用,真正用这些能量和物质的就是线程,比如一堆的白细胞去追杀病毒,用的是进程申请的资源,处理的是进程的事情,多个白细胞同时工作可以类比为多线程

注意:线程是异步的,所以类比起来比较奇怪的,你想想,一个白细胞刚刚准备吞一个病毒,结果上面说你先暂停,另一个白细胞准备去死了。。。

 

以下是python2相关例程:

多进程:

import multiprocessing

# 子进程1
def multiProc1(number):
    time.sleep(3)
    print(number)

# 子进程2
def multiProc2(number):
    print(number)

# 父进程
def mainProc():
    print("Welcome!!!")

    # 启动两个进程(两个同时运行,不用等待结束后再启动下一个)
    p = multiprocessing.Process(target=multiProc1,args =(1))
    print('Child process multiProc1 will start.')
    p.start()

    p = multiprocessing.Process(target=multiProc1,args =(2))
    print('Child process multiProc1 will start.')
    p.start()

if __name__ == '__main__':
    mainProc()

多进程(用的比较多的就是这个socket):

服务端:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import socket
import threading

def tcplink(sock, addr):
    print('Accept new connection from %s:%s...' % addr) 
    sock.send(b'Welcome_To_Join_The_Conference')    # 发送欢迎信息
    while True:
        data = sock.recv(1024)  # 接收客户端信息
        if not data or data.decode('utf-8') == 'exit':
            break
    
    # 关闭连接
    sock.close()
    print('Connection from %s:%s closed.' % addr)

def startServer():

    # 配置服务端
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = '192.168.0.102'     # 配置服务器IP地址
    port = 8888    # 配置服务器端口号(使用1025~65535端口号)
            
    # 绑定端口
    try:
        s.bind((host, port))        # 绑定端口
        print("Server started successfully !")
    except OSError:
        return False
    
    s.listen(5)
    print('Waiting for connection...')
        
    # 启动多线程,等待客户端连接
    while True:
        sock, addr = s.accept()
        t = threading.Thread(target=tcplink, args=(sock, addr))
        t.start()


if __name__ == '__main__':
    startServer()

客户端(多运行几个客户端就可以体会到多线程的含义):

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import socket

def connectServer():
    try:
        # 配置客户端
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        host = '192.168.0.102'     # 配置服务器IP地址
        print('Current computer IP address:' + host)
        port = 8888    # 配置服务器端口号(使用1025~65535端口号)

        # 连接服务端
        s.connect((host, port))
        data = s.recv(1024).decode('utf-8')    # 接收欢迎信息
        print(data)
        s.send(b'Welcome_To_Join_The_Conference')    # 发送消息到服务端
 
            
    except Exception,err:
        print(err)
    finally:
        s.send(b'exit')
        s.close()

if __name__ == '__main__':
    connectServer()

为什么说这个python的多线程是假的多线程呢?

因为全局解释器锁的问题,说白话点就是现在的处理器大都是多核的,但是python多线程占用永远只有一个核,也就是说你是一个八核处理器,你可以用python写八个个死循环的线程,你就会发现这个cpu占用率永远只有大概12.5%左右,但是像c语言这种写的多线程,可以搞到100%,想要python的程序也能100%的占用,你试试把八个死循环线程换成多进程。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值