python 单线程_python的单线程多任务的实现

这篇文章主要为大家详细介绍了python实现单线程多任务非阻塞TCP服务端的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了python实现单线程多任务非阻塞TCP服务端的具体代码,供大家参考,具体内容如下

# coding:utf-8

from socket import *

# 1.创建服务器socket

sock = socket(AF_INET, SOCK_STREAM)

# 2.绑定主机和端口

addr = ('', 7788) #

sock.bind(addr)

# 3. 设置最大监听数目,并发

sock.listen(10)

# 4. 设置成非阻塞

sock.setblocking(False)

# 保存客户端socket

clientAddrList = []

# print(sock.)

while 1:

try:

clientSocket, clientAddr = sock.accept()

except:

pass

else:

print("一个新客户端到来:%s" % str(clientAddr))

clientSocket.setblocking(False)

clientAddrList.append((clientSocket, clientAddr))

for clientSocket, clientAddr in clientAddrList:

try:

recvData = clientSocket.recv(1024)

except:

pass

else:

if len(recvData) > 0:

print("%s:%s" % (str(clientAddr), recvData))

else:

clientSocket.close()

clientAddrList.remove((clientSocket, clientAddr))

print("%s 已经下线" % str(clientAddr))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种灵活的编程语言,其提供了多种多样的库和框架,以方便用户处理数据和进行网络爬取。在网络爬取方面,Python具有优秀的单线程和多线程爬取能力。 Python单线程爬取实例: 当我们需要爬取一个简单的网站时,单线程爬取可能是最简单和最有效的方法。例如,我们可以编写一个程序来爬取一个网站的所有页面,并将它们保存到本地文件夹中。这个程序可能像这样: ```Python import requests from bs4 import BeautifulSoup def getUrls(url): response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') urls = [] for link in soup.find_all('a'): urls.append(link.get('href')) return urls def download(urls): for url in urls: response = requests.get(url) filename = url.split('/')[-1] with open(filename, 'wb') as f: f.write(response.content) if __name__ == '__main__': urls = getUrls('http://example.com') download(urls) ``` 在这个例子中,我们使用requests和BeautifulSoup库来获取和解析HTML页面,然后使用循环和文件I/O来保存页面内容。 Python多线程爬取实例: 当我们需要爬取大量页面时,单线程爬取可能会非常缓慢,因此我们可以使用多线程爬取来提高效率。例如,我们可以使用Python的多线程库threading来实现多线程爬取。下面是代码示例: ```Python import requests from bs4 import BeautifulSoup import threading def getUrls(url): response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') urls = [] for link in soup.find_all('a'): urls.append(link.get('href')) return urls def download(url): response = requests.get(url) filename = url.split('/')[-1] with open(filename, 'wb') as f: f.write(response.content) class CrawlerThread(threading.Thread): def __init__(self, url): threading.Thread.__init__(self) self.url = url def run(self): download(self.url) if __name__ == '__main__': urls = getUrls('http://example.com') threads = [] for url in urls: t = CrawlerThread(url) threads.append(t) t.start() for t in threads: t.join() ``` 在这个例子中,我们使用多线程CrawlerThread类来下载每个页面。我们创建一个CrawlerThread列表,然后将列表中的每个元素作为参数传递给download函数,以便每个线程都可以执行下载任务。最后,我们使用join方法等待所有线程完成。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值