首页 文章

在共享数据时多处理两个功能

提问于
浏览
0

我刚开始使用Python,所以请耐心等待 .

我的代码现在看起来像这样(简化)

lst = []

def func1():
    while True:
        **doing some stuff with selenium, performing some operations on lst**

        **I never break the loop**

def func2():
    while True:
        **doing some stuff with selenium, performing some operations on lst**
        **I never break the loop**

到现在为止还挺好 . 但是,我需要同时运行这两个函数,同时还要对同一个列表执行操作并进行交换 . 例如,func1可能会向lst附加某些内容,而func2可能会从lst中删除某些内容,然后func1可能会删除某些内容等 . 这两个函数都需要无限期运行,因此infinte循环不会让它变得更容易 .

我读了一些关于多线程的内容,但是根据我的理解,多线程并不真正并行,所以我的代码执行速度会慢一点 . 这根本不是一个选择 . 我还读到多线程和Selenium并不完全是天上的匹配 .

那么,我该怎么做呢?我需要这两个函数能够在我的列表上执行操作,同时无限期地运行 .

我也可以在Multiprocessing的东西上使用一些帮助 . 映射,池,队列...我甚至不知道从哪里开始 .

我真的需要你的帮助,我非常感激 .

其他信息(我真的不知道它是否重要):所有这些都是在使用Python 2.7和Selenium和Chromedriver的Windows机器上运行的 .

1 回答

  • 0

    使用shared list proxylock在进程之间同步 lst .

    伪代码:

    import multiprocessing as mp
    
    def func1(lst, lock):
        while True:
            lock.acquire()
            # **doing some stuff with selenium, performing some operations on lst**
            lock.release()
    
            # **I never break the loop**
    
    def func2(lst, lock):
        while True:
            lock.acquire()
            # **doing some stuff with selenium, performing some operations on lst**
            lock.release()
            # **I never break the loop**
    
    lst = mp.Manager().list()
    lock = mp.Lock()
    p1 = mp.Process(target=func1, args=(lst,lock))
    p2 = mp.Process(target=func2, args=(lst,lock))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    

    请注意,默认情况下 lst 中的项应该是标量,Python使用卷影副本进行进程之间的同步 .

    如果 lst 包含其他类型的元素(如list或dict或object),则必须将其重新分配给 lst 每个操作 .

相关问题