首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >锁在多进程中不锁定

锁在多进程中不锁定
EN

Stack Overflow用户
提问于 2020-04-11 05:06:20
回答 1查看 33关注 0票数 1
代码语言:javascript
复制
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)}")

我得到的结果是...

代码语言:javascript
复制
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,我还有一个问题。如果它们是不同的进程,为什么会有相同的变量"lista"?我以为每个进程都有自己的数据副本。

EN

回答 1

Stack Overflow用户

发布于 2020-04-11 05:32:11

在类unix系统上,Process将使用父内存空间的写入时复制视图派生一个子进程。在Windows上,它将生成一个新的python进程,并尝试对子进程进行相关状态的pickle/unpickle。在这两种情况下,子进程都会获得完整的lista,并且任何弹出或删除项都只对该子流程有效。(在您的例子中,您的代码不能在Windows上工作,因为锁不能被酸洗)。

您可以使用multiprocessing.Manager来创建在两个进程中代理的列表视图,但这通常效率不高。改用Pool吧,它已经为你想要的东西而构建了。

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61148680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档