python - 锁定不锁定多处理
问题描述
from multiprocessing import Process, Lock, current_process
import requests as r
def get(lista, lista_lock):
lista_lock.acquire()
print(f"PID: {current_process().name} ID liste: {id(lista)}")
temp = lista[:1]
del lista[:1]
lista_lock.release()
res = r.get(*temp)
print(f"PID: {current_process().name} -> {res.url}")
if __name__ == "__main__":
lista = ["https://www.index.hr", "https://www.24sata.hr"]
lista_lock = Lock()
p1 = Process(target=get, args=(lista, lista_lock))
p2 = Process(target=get, args=(lista, lista_lock))
p1.start()
p2.start()
p1.join()
p2.join()
print(f"lista ID: {id(lista)}")
结果我得到的是...
PID: Process-1 ID liste: 140292127163144
PID: Process-2 ID liste: 140292127163144
PID: Process-1 -> https://www.index.hr/
PID: Process-2 -> https://www.index.hr/
lista ID: 140292127163144
每个进程都应该获得不同的链接,但它们获取的链接相同。锁似乎不起作用。有人可以帮帮我吗。
关于“lista”的 ID,我还有 1 个问题。如果这些是不同的过程,为什么它们具有相同的变量“lista”?我认为每个进程都有自己的数据副本。
解决方案
在类 unix 系统上,Process
将使用父内存空间的写时复制视图来分叉一个子进程。在 Windows 上,它将生成一个新的 python 进程,并尝试将相关状态腌制/取消腌制给子进程。在这两种情况下,子进程都会获得完整的lista
,并且任何弹出或删除项目仅对该子进程有效。(在您的情况下,您的代码将无法在 Windows 上运行,因为无法腌制锁)。
您可以使用 amultiprocessing.Manager
创建在两个进程中代理的列表视图,但这通常效率不高。改用Pool
它,它已经为您想要的而构建。
import multiprocessing as mp
import requests as r
def get(item):
print(f"PID: {mp.current_process().name} item: {item}")
res = r.get(item)
print(f"PID: {mp.current_process().name} -> {res.url}")
if __name__ == "__main__":
lista = ["https://www.index.hr", "https://www.24sata.hr"]
pool = mp.Pool(min(len(lista), mp.cpu_count()))
pool.map(get, lista)
pool.close()
pool.join()
推荐阅读
- java - 无效的 bean 定义:无法解析占位符
- if-statement - 非常简单的 if/else 语句似乎在倒退
- scala - 火花作业给出路径已经存在错误,即使使用 df.overwrite
- appium - 如何使用 uiautomator 与嵌入在 android.webkit.WebView 中的元素进行交互
- elasticsearch - 如何为日期线多行 Logstash?
- c# - 如何在 asp.net web api 项目而不是 .net core 上使用 DI
- vue.js - 每次调整窗口大小时如何运行挂载函数然后销毁事件侦听器
- r - 绘制具有绝对值和百分比值 + 标签的分组条形图
- javascript - 尝试在我的代码中使用 await with promise - 如何?
- android - onClickListener 在导航抽屉上不起作用