gpt4 book ai didi

python - 如何使用多处理创建 nntplib 对象

转载 作者:行者123 更新时间:2023-12-01 02:35:48 26 4
gpt4 key购买 nike

在创建与 NNTP 服务器的连接时,尝试了 2 天让多重处理正常工作。目标:尽可能快地建立一堆连接(例如 50 个)。由于在 for 循环中建立连接可能会很慢(例如长达 10 秒),因此我想使用多重处理“一次”将它们全部建立。创建连接后,它们保持打开状态,因为基于类似的原理,在未来的多处理部分中将发出 10,000 多个请求。

代码的一些简化部分:

#!/usr/bin/env python3

import sys
import ssl
from nntplib import NNTP_SSL
from multiprocessing import Pool

def MakeCon(i, host, port):
context = ssl.SSLContext(ssl.PROTOCOL_TLS)
s = NNTP_SSL(host, port=port, ssl_context=context, readermode=True)
print('created connection', i) # print to see progress
sys.stdout.flush()
return s

def Main():
host = 'reader.xsnews.nl'
port = 563
num_con = 4

y=MakeCon(1, host, port).getwelcome() #request some message from NNTP host to see if it works
print(y)

# the actual part that has the issue:
if __name__ == '__main__':

cons = range(num_con)
s = [None] * num_con
pool = Pool()
for con in cons:
s[con]=pool.apply_async(MakeCon, args=(con, host, port))
pool.close

print(s[1])
for con in cons:
t=s[con].getwelcome() #request some message from NNTP host to see if it works
print(t)

print('end')

Main()

显示与 NNTP 服务器等的连接有效,但我无法将连接提取到可以与 nntplib 选项结合使用的某个对象中。我想说我对 python 没有那么丰富的经验,尤其是多处理方面。

最佳答案

您的方法存在一些不同的问题。最大的是,在不同进程中创建连接然后将它们发送到主进程是行不通的。这是因为每个连接都会打开一个套接字,并且套接字不可序列化(可选取),因此无法在进程之间发送。

即使它有效,使用 .apply_sync() 也不是正确的方法。最好使用 .map() ,它直接返回函数调用的输出(而不是 .apply_sync() ,它返回一个对象,从中返回值可以被提取)。

但是,在当前情况下,程序受 I/O 限制,而不是 CPU 限制,并且在这些情况下,线程与多处理一样有效,因为 GIL不会阻止执行。因此,将 .apply_sync() 更改为线程而不是多处理,并更改为 .map() 可以得到以下解决方案:

#!/usr/bin/env python3

import sys
import ssl
from nntplib import NNTP_SSL
from multiprocessing.pool import ThreadPool

def MakeCon(i, host, port):
context = ssl.SSLContext(ssl.PROTOCOL_TLS)
s = NNTP_SSL(host, port=port, ssl_context=context, readermode=True)
print('created connection', i) # print to see progress
sys.stdout.flush()
return s

def Main():
host = 'reader.xsnews.nl'
port = 563
num_con = 4

y=MakeCon(1, host, port).getwelcome() #request some message from NNTP host to see if it works
print(y)
return con

cons = range(num_con)
s = [None] * num_con
pool = ThreadPool()
s=pool.map(lambda con: MakeCon(con, host, port), cons)
pool.close

if __name__ == "__main__":
Main()

不过,有一点建议。创建太多连接时要小心,因为这可能会导致服务器无法很好地处理,因为这样做会耗尽资源。

此外,如果您要使用不同的连接来获取文章,这些调用可能也应该在不同的线程中完成。

并且,作为最后的评论,与使用线程相同的效果是使用asyncio。然而,您可能需要学习一段时间才能轻松使用。

关于python - 如何使用多处理创建 nntplib 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46256028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com