【发布时间】:2017-02-09 13:08:53
【问题描述】:
对于网络抓取分析,我需要两个永久运行的循环,一个返回一个包含每 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()
所以,这是我在完成在线介绍课程后的第一个 Python 项目,我在这里苦苦挣扎。我现在明白了,这些函数并没有真正并行运行,因为 b 直到 a 完成才开始(我用this 回答了一个修改了计时器的答案,而当真)。 编辑:即使使用了答案中给出的方法,我认为情况仍然如此,因为queue.get() 抛出一个 IndexError 说,双端队列是空的。我只能用没有完成的过程来解释,因为当我打印 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 真的是正确的工具吗? 我在哪里可以获得关于设计我的程序的好信息。
【问题讨论】:
-
Thread 绝对是您问题的最简单答案!这可能很可怕,但在 Python 中很容易做到
-
@Lordofdark 我也会接受这个建议并阅读线程!谢谢。
标签: python while-loop parallel-processing