python的多线程和多进程

要使用Python的多线程,首先要了解一个概念。GIL(global interpreter lock),翻译过来就是以解释器为单位的全局锁。

用过线程锁的都知道,LOCK就是用来管理住线程,让一个指定的线程先运行,其他的先暂停(等待),避免线程的混乱,尤其是在共用变量的情况下。

GIL也是一样的概念,但是不同的是:

1.你可以想成他是解释器控制的

2.线程的指定是随机的

3.每个线程acquire运行机会后,可运行的内容很少(因此线程间的切换超级快)

因此,多线程看起来好像是多个线程一起运行,实际上也是大家轮流。比起单线程,他还多了一个线程切换的开销,因此执行效率上,很多时候是不如单线程的。

那多线程有什么用的,我认为在以下及方面,还是用多线程比较有效率:

1.单线程只能根据顺序一行行从上往下执行。那你想一遍操作前台,一边后台记录日志的时候,就需要用到多线程。或者你想一边运行脚本,一边等待指令来停止脚步的时候,也需要多线程。

2.对于IO密集型的线程,多线程则可以提高效率。例如下面的例子,线程向服务器发送信息,服务器接收后等待5s再返回给线程。如果用单线程的方式,则一共要等待10s

from client import send_and_receive
def main():
    start_time = time.time()
    for i in [40080,40081]:
         t = Thread(target=send_and_receive, args=(i,))
         t.start()
         t.join()
    end_time = time.time()
    print("Total time: {}".format(end_time - start_time))

if __name__ == ‘__main__‘:
    main()
而使用多线程的方式,则一共只要等待5左右s,因为这个等待是同步的
from client import send_and_receive
def main():
    start_time = time.time()
    for i in [40080,40081]:
        t = Thread(target=send_and_receive,args=(i,))
        t.start()
    t.join()
    end_time = time.time()
    print("Total time: {}".format(end_time - start_time))

if __name__ == ‘__main__‘:
    main()
****************************client**********************
import socket
def send_and_receive(port):
    s_obj=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s_obj.connect((‘localhost‘,port))
    s_obj.send(‘x‘)
    while True:
        buf=s_obj.recv(1024)
        if buf!=‘‘:
            return buf
****************************server**********************#为更准确的统计时间,服务器写了2个不同端口的,而不是在服务器中使用线程
import socket
import time
s_obj=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s_obj.bind((‘localhost‘,40080))
s_obj.listen(5)
while True:
    conn,ipaddr=s_obj.accept()
    while True:

        if conn.recv(1024)!=‘‘:
            time.sleep(5)
            print ‘send back‘
            conn.send(‘back‘)
            conn.close()
            break

原文地址:https://www.cnblogs.com/fishbiubiu/p/10202028.html

时间: 2024-12-14 18:13:50

python的多线程和多进程的相关文章

Python的多线程和多进程模块对比测试

本文主要对比测试Python的多线程和多进程模块在CPU类型和I/O的任务操作时的效率 一 测试CPU消耗类型任务 在一台多核CPU的服务器上执行多线程代码,理论上代码执行时会利用多余的CPU核心来提升性能.但是由于Python的GIL的存在,使用多线程来执行CPU繁重的任务,未必能得到性能提升.但是GIL又必不可少,因为在Python解释器中执行线程是不安全的,也就是说为了保证Python线程执行时的安全,Python提供了一个全局锁,同一时刻,只允许一个线程获得这个全解锁并执行. CPU消耗

Python的多线程与多进程实践

最近要产生大量的”假“的电话号码,所以就写了一个自动产生电话号码程序,产生了一百万条数据,然后把数据放到一个文件中. 死跑版: # -*- coding: utf-8 -*- # 以下是中国的手机号码分段情况 # 新联通 (中国联通+中国网通)手机号码开头数字 130.131.132.145. # 155.156.185.186 # 新移动 (中国移动+中国铁通)手机号码开头数字 134.135.136.137. # 138.139.147.150.151.152.157.158.159.182

python socket多线程和多进程

在socket中,如果直接创建的话,是只能接受一个用户的请求需要实现socketserver中的handle方法,可以实现多进程并发访问 SocketServer内部使用 IO多路复用 以及 "多线程" 和 "多进程" ,从而实现并发处理多个客户端请求的Socket服务端.即:每个客户端请求连接到服务器时,Socket服务端都会在服务器是创建一个"线程"或者"进 程" 专门负责处理当前客户端的所有请求. 1.创建一个继承自 s

python中多线程,多进程,队列笔记(一)

threading简介:If you want your application to make better use of the computational resources of multi-core machines, you are advised to use multiprocessing. However, threading is still an appropriate model if you want to run multiple I/O-bound tasks si

python之多线程与多进程

1. 多进程与多线程 (1)背景:为何需要多进程或者多线程:在同一时间里,同一个计算机系统中如果允许两个或者两个以上的进程处于运行状态,这便是多任务.多任务会带来的好处例如用户边听歌.边上网.边打印,而这些任务之间丝毫不会互相干扰.使用多进程技术,可大大提高计算机的运算速率. (2)多进程与多线程的区别: 进程:程序在计算机上的一次执行活动.进程分为:系统进程和用户进程. 当运行一个程序时,实际就是启动了一个进程.程序是死的(静态的),进程是活的(动态的). 线程:是程序中的一个单一的顺序控制流

python的多线程、多进程代码示例

多线程有两种方式:thread和threading 这里应用的场景是map数据分多线程.进度写入codis的示例 这是thread的示例:thread的主进程不会等待线程 import thread,math,threading,multiprocessing,os,time def writeToCodis(prefix,key_list,result_map): # client = BfdCodis("xxx", ) begin = int(time.time()) for ke

基于Python的多线程与多进程

1.I/O密集型与计算密集型 多进程适用于I/O密集型 多进程适用于计算密集型 2.没有sleep(T)的多个死循环只能用多进程 3.模块介绍: 1)threading模块(_thread模块已淘汰)示例: 运行结果: 2)multiprocessing 模块演示: 代码结果: 3) concurrent.futures模块 执行结果: 原文地址:https://www.cnblogs.com/cepaAllium/p/11528994.html

appium 多线程还是多进程(转)

https://www.cnblogs.com/zouzou-busy/p/11440175.html 在前面我们都是使用一个机器进行测试,在做app自动化的时候,我们要测不同的机型,也就是兼容性测试,如果一台一台设备去执行,那就显的太麻烦了.所以经常需要我们启动多个设备,同时跑自动化测试用例,要跑多个设备时,首先要启动多个appium服务. 启动多个appium服务 在之前我们都是在命令行里输入appium来启动appium服务,这样启动的默认端口是4723,我们可以使用-p参数来指定端口号,

python多线程、多进程以及GIL

多线程 使用threading模块创建线程 传入一个函数 这种方式是最基本的,即调用threading中的Thread类的构造函数,然后指定参数target=func,再使用返回的Thread的实例调用start()方法,即开始运行该线程,该线程将执行函数func,当然,如果func需要参数,可以在Thread的构造函数中传入参数args=(-).示例代码如下 import threading #用于线程执行的函数 def counter(n): cnt = 0; for i in xrange