ウェブスクレイピング解析では、永続的に実行する2つのループが必要です.1つはx分ごとに更新されたWebサイトでリストを返し、もう1つはy秒ごとにサイト(古いもの)を分析します。これは私がやろうとしていますが、それは動作しませんどのような、例示コードの構造である:コードは答えと私の研究Pythonで2つの相互依存するwhileループを実行していますか?
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プロジェクトでありますオンライン入門コースです。私はここで大きな時間を費やしています。私は今、関数が本当に並列に実行されないことを理解しています。なぜなら、aが終了するまでbが始まらないからです(私はthisと答えました。 EDIT:答えに示されたアプローチを使用した後でさえ、queue.get()
がIndexErrorをスローするので、両端キューが空であるため、これはまだ当てはまると思います。私は、処理が完了していないと説明することができます。なぜなら、queue.get()を出力すると.put(x)の直後に が出力されるからです。
私は最終的に、このような出力をしたい:私は1つが更新されたリストに、他のループは、分析の基礎として必要とするすべてのx分を返して2つの真の並列ループを持つために
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
.
.
何が必要ですか?プロセスは本当にここに適切なツールですか? そして、どこで私のプログラムの設計に関する良い情報を得ることができますか?
スレッドは間違いなくあなたの問題に最も簡単な答えです!それは恐ろしいかもしれませんが、Pythonでやるのはかなり簡単です。 – Fabich
@Lordofdark私はそのアドバイスを受けてスレッドでも読むでしょう!ありがとう。 – user2822564