2016-08-09 15 views
6

Tôi đã tìm kiếm ở mọi nơi và tôi không tìm thấy bất kỳ ví dụ đơn giản nào về lặp vòng lặp với đa luồng.Multithread đơn giản cho vòng lặp trong Python

Ví dụ: làm cách nào tôi có thể thực hiện đa luồng vòng lặp này?

for item in range(0, 1000): 
    print item 

Có cách nào để cắt nó thành 4 chuỗi, vì vậy một luồng có 250 lần lặp lại không?

Trả lời

3

Cách dễ nhất là với multiprocessing.dummy (trong đó sử dụng đề thay vì quy trình) và một Pool

import multiprocessing.dummy as mp 

def do_print(s): 
    print s 

if __name__=="__main__": 
    p=mp.Pool(4) 
    p.map(do_print,range(0,10)) # range(0,1000) if you want to replicate your example 
    p.close() 
    p.join() 

Có lẽ bạn muốn thử đa thực, quá nếu bạn muốn tận dụng tốt hơn nhiều CPU nhưng có một số hãy cẩn thận và guidelines để làm theo sau đó.

Có thể các phương pháp khác của Pool sẽ phù hợp hơn với nhu cầu của bạn - tùy thuộc vào những gì bạn đang thực sự cố gắng thực hiện.

+0

Cảm ơn! Điều gì sẽ xảy ra nếu tôi cần truyền các đối số khác cho hàm 'do_print'? – Anthony

+0

phụ thuộc - với multiprocessing.dummy không có vấn đề gì nhưng nếu bạn muốn chắc chắn bạn nên đặt các arg trong lặp lại - ví dụ với [zip] (https://docs.python.org/2.7/library/functions .html # zip) hoặc [list comprehensions] (https://docs.python.org/2.7/tutorial/datastructures.html#list-comprehensions) – janbrohl

+0

Vì một số lý do, mã này tạo ra khoảng 60 (!) chủ đề để lặp qua 'range (0, 1000)' cho tôi (Python 3.5) ... – ForceBru

4

Bạn sẽ phải làm những tách bằng tay:

import threading 

def ThFun(start, stop): 
    for item in range(start, stop): 
     print item 

for n in range(0, 1000, 100): 
    stop = n + 100 if n + 100 <= 1000 else 1000 
    threading.Thread(target = ThFun, args = (n, stop)).start() 

Mã này sử dụng đa luồng , có nghĩa là tất cả mọi thứ sẽ được chạy trong một quá trình Python duy nhất (tức là chỉ có một thông dịch Python sẽ được ra mắt) .

Đa, thảo luận trong câu trả lời khác, có nghĩa là chạy một số mã trong một số thông dịch Python (trong một số quá trình, không đề). Điều này có thể sử dụng tất cả các lõi CPU có sẵn, vì vậy điều này rất hữu ích khi bạn tập trung vào tốc độ mã của bạn (in một tấn số cho đến khi thiết bị đầu cuối ghét bạn!), không chỉ đơn giản là xử lý song song.


1. multiprocessing.dummy hóa ra là a wrapper around the threading module. multiprocessingmultiprocessing.dummy có cùng giao diện nhưng mô-đun đầu tiên xử lý song song bằng cách sử dụng các quy trình , trong khi mô-đun thứ hai - sử dụng chủ đề.

+0

multiprocessing.dummy thực sự sử dụng các chủ đề - chỉnh sửa câu trả lời của tôi để làm cho rõ ràng hơn – janbrohl

+0

'multiprocessing.dummy' thực sự là một trình bao bọc xung quanh mô-đun' luồng', nhưng 'tự xử lý' hoạt động chính xác như được mô tả trong phần gạch chéo của câu trả lời. Cái nào được chọn tùy thuộc vào hành vi mà người ta muốn, mã là rất giống nhau (đó là điều tốt). – miraculixx

+0

@miraculixx, đây là lý do tại sao tôi quyết định không loại bỏ hoàn toàn phần chéo: 'multiprocessing' và' multiprocessing.dummy' có giao diện tương tự, nhưng sự lựa chọn của một mô-đun ảnh hưởng đến hành vi (luồng vs tiến trình). – ForceBru

Các vấn đề liên quan