Đây là điều kỳ lạ nhất!Hệ điều hành bắt đầu quá trình giết khi quá trình python đa luồng chạy
Tôi có ứng dụng khách đa luồng được viết bằng Python. Tôi đang sử dụng luồng để đồng thời tải xuống và xử lý các trang. Tôi sẽ sử dụng đa xử lý cURL ngoại trừ nút cổ chai chắc chắn là bộ vi xử lý (không phải băng thông) trong ứng dụng này vì vậy nó là hiệu quả hơn để sử dụng một hồ bơi thread.
Tôi có RAM 64 GB i7 rocking 16 GB. Thịt bò. Tôi khởi động 80 chủ đề trong khi nghe Pandora và trolling Stackoverflow và BAM! Quá trình cha mẹ đôi khi kết thúc với thông điệp
Killed
lần khác một trang duy nhất (mà là đó là quá trình riêng trong Chrome) sẽ chết. Lần khác toàn bộ trình duyệt bị treo.
Nếu bạn muốn xem một chút mã ở đây là các ý chính của nó:
Đây là quá trình cha mẹ:
def start():
while True:
for url in to_download:
queue.put((url, uri_id))
to_download = [ ]
if queue.qsize() < BATCH_SIZE:
to_download = get_more_urls(BATCH_SIZE)
if threading.activeCount() < NUM_THREADS:
for thread in threads:
if not thread.isAlive():
print "Respawning..."
thread.join()
threads.remove(thread)
t = ClientThread(queue)
t.start()
threads.append(t)
time.sleep(0.5)
Và đây là ý chính của ClientThread:
class ClientThread(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while True:
try:
self.url, self.url_id = self.queue.get()
except:
raise SystemExit
html = StringIO.StringIO()
curl = pycurl.Curl()
curl.setopt(pycurl.URL, self.url)
curl.setopt(pycurl.NOSIGNAL, True)
curl.setopt(pycurl.WRITEFUNCTION, html.write)
curl.close()
try:
curl.perform()
except pycurl.error, error:
errno, errstr = error
print errstr
curl.close()
EDIT: Ồ, phải ... quên đặt câu hỏi ... nên rõ ràng: Tại sao các quy trình của tôi bị giết? Có phải nó đang xảy ra ở cấp hệ điều hành không? Cấp hạt nhân? Đây có phải là do hạn chế về số lượng kết nối TCP mở mà tôi có thể có không? Có giới hạn số lượng chủ đề tôi có thể chạy cùng một lúc không? Đầu ra của cat /proc/sys/kernel/threads-max
là 257841
. Vì vậy ... Tôi không nghĩ rằng đó là ....
Tôi nghĩ rằng tôi đã có nó ... OK ... Tôi không có không gian trao đổi ở tất cả trên ổ đĩa của tôi. Có cách nào để tạo không gian hoán đổi không? Tôi đang chạy Fedora 16. Có trao đổi ... sau đó tôi kích hoạt tất cả RAM của tôi và nó biến mất một cách kỳ diệu. Tailing /var/log/messages
tôi thấy lỗi này:.
Mar 26 19:54:03 gazelle kernel: [700140.851877] [15961] 500 15961 12455 7292 1 0 0 postgres
Mar 26 19:54:03 gazelle kernel: [700140.851880] Out of memory: Kill process 15258 (chrome) score 5 or sacrifice child
Mar 26 19:54:03 gazelle kernel: [700140.851883] Killed process 15258 (chrome) total-vm:214744kB, anon-rss:70660kB, file-rss:18956kB
Mar 26 19:54:05 gazelle dbus: [system] Activating service name='org.fedoraproject.Setroubleshootd' (using servicehelper)
Kiểm tra đầu ra 'dmesg (8)' để xem nếu hạt nhân đăng nhập bất kỳ thông tin nào. – sarnold
Cảm ơn ... sẽ làm ... – KeatsKelleher
mục cuối cùng trong 'dmesg (8)' liên quan đến bộ điều hợp wifi của tôi kết hợp với bộ định tuyến của tôi. ... đó là giờ trước đây – KeatsKelleher