我刚开始使用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计算机上运行。
答案 0 :(得分:0)
使用shared list proxy和lock在进程之间同步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
。