如何 运行 与 ThreadPoolExecutor 并行编码?
How to run code in parallel with ThreadPoolExecutor?
嗨,我是线程的新手,这让我很困惑,我如何 运行 并行执行此代码?
def search_posts(page):
page_url = f'https://jsonplaceholder.typicode.com/posts/{page}'
req = requests.get(page_url)
res = req.json()
title = res['title']
return title
page = 1
while True:
with ThreadPoolExecutor() as executer:
t = executer.submit(search_posts, page)
title = t.result()
print(title)
if page == 20:
break
page += 1
另一个问题是我需要学习操作系统才能理解线程是如何工作的吗?
这里的问题是您正在为每个页面创建一个新的 ThreadPoolExecutor
。要并行处理,只创建一个 ThreadPoolExecutor
并使用它的 map
方法:
import concurrent.futures as cf
import requests
def search_posts(page):
page_url = f'https://jsonplaceholder.typicode.com/posts/{page}'
res = requests.get(page_url).json()
return res['title']
if __name__ == '__main__':
with cf.ThreadPoolExecutor() as ex:
results = ex.map(search_posts, range(1, 21))
for r in results:
print(r)
请注意,使用 if __name__ == '__main__'
包装器是使您的代码更具可移植性的好习惯。
使用线程时要记住的一件事;
如果您正在使用 CPython(来自 python.org
的 Python 实现,这是最常见的实现),线程不会 实际上 运行 并行.
为了使内存管理不那么复杂,在 CPython 中一次只能 一个 线程可以执行 Python 字节码。这是由 CPython.
中的全局解释器锁(“GIL”)强制执行的
好消息是,使用 requests
获取网页将花费大部分时间使用网络 I/O。通常,GIL 在 I/O.
期间发布
但是,如果您在辅助函数中进行计算(即执行 Python 字节码),则应改用 ProcessPoolExecutor
。
如果您使用 ProcessPoolExecutor
并且 运行 正在使用 ms-windows,则 需要使用 if __name__ == '__main__'
包装器,因为 Python 必须能够 import
你的主程序 而没有副作用 在那种情况下。
嗨,我是线程的新手,这让我很困惑,我如何 运行 并行执行此代码?
def search_posts(page):
page_url = f'https://jsonplaceholder.typicode.com/posts/{page}'
req = requests.get(page_url)
res = req.json()
title = res['title']
return title
page = 1
while True:
with ThreadPoolExecutor() as executer:
t = executer.submit(search_posts, page)
title = t.result()
print(title)
if page == 20:
break
page += 1
另一个问题是我需要学习操作系统才能理解线程是如何工作的吗?
这里的问题是您正在为每个页面创建一个新的 ThreadPoolExecutor
。要并行处理,只创建一个 ThreadPoolExecutor
并使用它的 map
方法:
import concurrent.futures as cf
import requests
def search_posts(page):
page_url = f'https://jsonplaceholder.typicode.com/posts/{page}'
res = requests.get(page_url).json()
return res['title']
if __name__ == '__main__':
with cf.ThreadPoolExecutor() as ex:
results = ex.map(search_posts, range(1, 21))
for r in results:
print(r)
请注意,使用 if __name__ == '__main__'
包装器是使您的代码更具可移植性的好习惯。
使用线程时要记住的一件事;
如果您正在使用 CPython(来自 python.org
的 Python 实现,这是最常见的实现),线程不会 实际上 运行 并行.
为了使内存管理不那么复杂,在 CPython 中一次只能 一个 线程可以执行 Python 字节码。这是由 CPython.
中的全局解释器锁(“GIL”)强制执行的好消息是,使用 requests
获取网页将花费大部分时间使用网络 I/O。通常,GIL 在 I/O.
但是,如果您在辅助函数中进行计算(即执行 Python 字节码),则应改用 ProcessPoolExecutor
。
如果您使用 ProcessPoolExecutor
并且 运行 正在使用 ms-windows,则 需要使用 if __name__ == '__main__'
包装器,因为 Python 必须能够 import
你的主程序 而没有副作用 在那种情况下。