gpt4 book ai didi

python - 在python中运行两个相互依赖的while循环?

转载 作者:行者123 更新时间:2023-12-01 03:19:07 24 4
gpt4 key购买 nike

对于网络抓取分析,我需要两个永久运行的循环,一个循环返回一个每 x 分钟更新一次的网站列表,而另一个循环每 y 秒分析一次网站(旧的和新的)。这是示例的代码构造,我正在尝试做的事情,但它不起作用:代码已被编辑以包含答案和我的研究

from multiprocessing import Process
import time, random

from threading import Lock
from collections import deque

class MyQueue(object):
def __init__(self):
self.items = deque()
self.lock = Lock()

def put(self, item):
with self.lock:
self.items.append(item)
# Example pointed at in [this][1] answer
def get(self):
with self.lock:
return self.items.popleft()

def a(queue):
while True:
x=[random.randint(0,10), random.randint(0,10), random.randint(0,10)]
print 'send', x
queue.put(x)
time.sleep(10)


def b(queue):
try:
while queue:
x = queue.get()
print 'recieve', x
for i in x:
print i
time.sleep(2)
except IndexError:
print queue.get()



if __name__ == '__main__':
q = MyQueue()
p1 = Process(target=a, args=(q,))
p2 = Process(target=b, args=(q,))
p1.start()
p2.start()
p1.join()
p2.join()

所以,这是我在在线入门类(class)之后的第一个 Python 项目,我在这里遇到了很大的困难。我现在明白了,这些函数并没有真正并行运行,因为 b 在 a 完成之前不会启动(我用 this 回答了一个修补计时器和 while True 的问题)。 编辑:即使在使用答案中给出的方法之后,我认为情况仍然如此,因为 queue.get() 抛出一个 IndexError 说,双端队列是空的。我只能解释说,进程 a 没有完成,因为当我打印 queue.get() 时紧随 .put(x) 之后它不为空。

我最终想要这样的输出:

send [3,4,6]
3
4
6
3
4
send [3,8,6,5] #the code above gives always 3 entries, but in my project
3 #the length varies
8
6
5
3
8
6
.
.

要拥有两个真正并行的循环,其中一个循环每 x 分钟返回一个更新的列表,另一个循环需要作为分析的基础,我需要什么? Process 真的是正确的工具吗?我在哪里可以获得有关设计程序的良好信息。

最佳答案

我不久前做了一些类似的事情。我认为使用 Process 是正确的方法,但是如果您想在进程之间传递数据,那么您可能应该使用 Queue。

https://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes

首先创建队列并将其传递给两个进程。一个可以写入,另一个可以读取。

我记得的一个问题是,读取进程将在队列上阻塞,直到有东西被推送到队列中,因此当进程 1 完成时,您可能需要将某种特殊的“终止”消息推送到队列,以便进程 2知道停止。

编辑:简单的例子。这不包括停止进程的干净方法。但它展示了如何启动 2 个新进程并将数据从一个进程传递到另一个进程。由于队列在 get() 上阻塞,函数 b 将自动等待来自 a 的数据,然后再继续。

from multiprocessing import Process, Queue
import time, random

def a(queue):
while True:
x=[random.randint(0,10), random.randint(0,10), random.randint(0,10)]
print 'send', x
queue.put(x)
time.sleep(5)


def b(queue):
x = []
while True:
time.sleep(1)
try:
x = queue.get(False)
print 'receive', x
except:
pass
for i in x:
print i


if __name__ == '__main__':
q = Queue()
p1 = Process(target=a, args=(q,))
p2 = Process(target=b, args=(q,))
p1.start()
p2.start()
p1.join()
p2.join()

关于python - 在python中运行两个相互依赖的while循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42137605/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com