python 并发编程

python 并发除了直接基于编译内核的 Stackless   python还有比较突出的一些例如gevent,eventlet greenlet等,主要概念是协程。


以下是用刷票(客户端)的例子,比多线程快n倍,不过还是不如Stackless:(ps:erlang并发还不如python 基于协程的Stackless)


gevent效率要高于eventlet

import eventlet,time
from eventlet.green import socket
data='''GET /survey.php?PjtID=3809787&SubjID=3886562&OptID=273136&fmt=json&result=0&rdm=0.925835819914937 HTTP/1.1
Host: page.vote.qq.com
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22
Referer: http://hb.qq.com/zt/2013/rgmnew/no1.htm
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: RK=NcDPkbje2o

'''
def send1():
    s=socket.socket()
    s.connect(('page.vote.qq.com',80))
    s.send(data)
    s.close()

send1()
pool=eventlet.GreenPool(512)
while True:pool.spawn_n(send1)

以下是windows下select 标准库并发服务器的例子:

import socket,select
port=818
data='''HTTP/1.1 200 OK
Server: nginx/0.8.54
Content-Type: text/html
Last-Modified: Thu, 07 Mar 2013 00:03:43 GMT
Access-Control-Allow-Origin: *
Accept-Ranges: bytes
Cache-Control: public, max-age=176022
Expires: Wed, 27 Mar 2013 09:30:34 GMT
Date: Mon, 25 Mar 2013 08:36:52 GMT
Connection: keep-alive

hello world!
'''
n=1
print 'Listen port 818'
service=socket.socket()
service.bind(('',port))
service.listen(1)
while 1:
    is_read=[service]
    is_write=[service]
    is_err=[]
    r,w,e=select.select(is_read, is_write, is_err,1)
    print r,w,e
    if r:
        s,con=service.accept()
        print con,'connected'
        s.recv(1024)
        s.send(data)
        s.close()
    else:
        print 'still waiting',n
        n+=1


一下是geventlet server模式的并发例子:

import eventlet

def handle(client):
    while True:
        c = client.recv(1)
        if not c: break
        client.sendall(c)

server = eventlet.listen(('0.0.0.0', 6000))
pool = eventlet.GreenPool(10000)
while True:
    new_sock, address = server.accept()
    pool.spawn_n(handle, new_sock)

这是gevent的例子,他自带一个补丁。


import gevent
from gevent import monkey
monkey.patch_all()
import socket

tno=500
data='''GET /survey.php?PjtID=3809787&SubjID=3886562&OptID=273136&fmt=json&result=0&rdm=0.925835819914937 HTTP/1.1
Host: page.vote.qq.com
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22
Referer: http://hb.qq.com/zt/2013/rgmnew/no1.htm
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: RK=NcDPkbje2o

'''
def send1():
    s=socket.socket()
    s.connect(('page.vote.qq.com',80))
    s.send(data)
    s.close()
    print "aaaa"

    

jobs = [gevent.spawn(send1) for url in range(tno)]
gevent.joinall(jobs)



此外python3 自带一个并法库,没怎么测试用。

自己看以前我的博客

### Python 并发编程教程与最佳实践 #### 理解并发编程的重要性 在现代计算环境中,高并发应用程序的需求日益增长。Python作为一种流行的语言,在处理并发任务方面提供了丰富的工具和支持[^1]。 #### 主要的并发模型及其特点 Python 支持三种主要的并发模型:线程、进程和异步编程。每种模型都有其独特的优势和局限性: - **线程**:适合用于I/O密集型任务,如网络请求或文件读写。然而,由于全局解释器锁(GIL),CPU密集型任务可能不会从中受益太多。 - **进程**:绕过了GIL的问题,适用于CPU密集型工作负载。但是创建新进程的成本较高,并且涉及更多的资源消耗。 - **异步编程**:利用协程实现了轻量级的任务切换,非常适合于大量短时间等待的操作,比如Web服务器响应客户端请求[^5]。 #### 编码实例展示不同类型的并发方法 ##### 使用 `threading` 模块实现多线程 ```python import threading def task(name): print(f"Thread {name} is running") threads = [] for i in range(3): t = threading.Thread(target=task, args=(i,)) threads.append(t) t.start() for thread in threads: thread.join() ``` ##### 利用 `multiprocessing` 进行多进程操作 ```python from multiprocessing import Process def process_task(name): print(f'Process {name}: starting') if __name__ == '__main__': processes = [Process(target=process_task, args=(f'{i}',)) for i in range(3)] for p in processes: p.start() for p in processes: p.join() ``` ##### 异步函数定义及执行 ```python import asyncio async def async_function(): await asyncio.sleep(1) print('Async function completed.') loop = asyncio.get_event_loop() loop.run_until_complete(async_function()) ``` #### 关键概念和技术要点 当涉及到具体实施时,有几个重要的考虑因素需要牢记: - 对于线程来说,确保任何共享的数据结构都是线程安全的; - 当采用多进程方案时,则需关注跨进程间的有效通讯机制; - 而对于异步编程而言,理解事件循环的工作原理至关重要[^3]。 #### 应对挑战的方法论建议 为了克服并发编程中存在的潜在困难,推荐遵循以下指导原则: - 明确区分任务性质——判断是属于I/O还是CPU绑定类型; - 合理选择合适的并发模式以匹配特定需求; - 探索最新的库更新和发展趋势,以便充分利用改进后的特性[^2];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值