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

时间:2018-12-10 04:01:13

标签: python multithreading python-2.7 multiprocessing python-multiprocessing

我刚开始使用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并非天生一对。

那么,我该如何实现呢?我需要两个函数都可以在无限期同时运行时对列表执行操作。

我也可以在多处理方面使用一些帮助。映射,池,队列...我什至都不知道从哪里开始。

我真的很需要您的帮助,我非常感谢。

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

1 个答案:

答案 0 :(得分: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包含其他类型的元素,例如列表,字典或对象,则必须在每个操作中将其重新分配给lst